staging.inyokaproject.org

grep und brace expansion

Status: Gelöst | Ubuntu-Version: Ubuntu MATE 22.04 (Jammy Jellyfish)
Antworten |

CarstenHa

Anmeldungsdatum:
1. Mai 2020

Beiträge: 52

Hallo, ich bin letztens beim Scripten auf eine Kleinigkeit gestoßen, die ich nicht ganz verstehe. Vielleicht kann mir jemand von Euch helfen. Warum funktioniert folgendes:

1
grep -eN{82..99} ./liste.txt

aber folgender Befehl hat eine andere Ausgabe:

1
grep -e N{82..99} ./liste.txt

unter anderem z.B.:

1
grep: N83: Datei oder Verzeichnis nicht gefunden

Was hat das Leerzeichen im zweiten Befehl für eine Bedeutung?

Doc_Symbiosis

Avatar von Doc_Symbiosis

Anmeldungsdatum:
11. Oktober 2006

Beiträge: 4212

Naja, also viele Befehle haben bei den Optionen eine Kurform, also z.B.

ls -al 

ist die Kurzform für

 ls -a -l

Bei grep finde ich allerdings nichts zu einer Option -N in der Manpage, daher weiß ich mit -eN nichts anzufangen, denn das würde "-e -N" entsprechen.

Kannst Du sagen, wo Du die Option -N her hast? Das "{82.99}" wird von der Bash-Expansion expandiert nach "82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99".

Das "N{82.99}" wird expandiert nach "N82 N83 N84 N85 N86 N87 N88 N89 N90 N91 N92 N93 N94 N95 N96 N97 N98 N99".

Also wird im ersten Beispiel im Endeffekt das hier ausgeführt:

grep -eN82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 ./liste.txt

Der zweite Befehl ergibt nach der Expansion folgendes:

grep -e -N82 N83 N84 N85 N86 N87 N88 N89 N90 N91 N92 N93 N94 N95 N96 N97 N98 N99 ./liste.txt

Also wird N83 als Dateiname genommen, der durchsucht werden soll, aber diese Datei existiert nicht.

EDIT: Mal anders gefragt: Was möchtest Du denn machen?

CarstenHa

(Themenstarter)

Anmeldungsdatum:
1. Mai 2020

Beiträge: 52

Option -e braucht ja noch ein Muster zur Suche und N gehört schon zum Suchmuster. In der Datei ist übrigens eine Liste von Geokoordinaten-Dateinamen. Also zum Beispiel:

N60E002.tif  
N60E003.tif
...  

usw.

CarstenHa

(Themenstarter)

Anmeldungsdatum:
1. Mai 2020

Beiträge: 52

Ahh, ich glaube, ich habe es verstanden. Das Leerzeichen wird als Suchmuster genommen und die brace expansion UND der Dateiname liste.txt als Dateien. Danke 😀

user_unknown

Avatar von user_unknown

Anmeldungsdatum:
10. August 2005

Beiträge: 17432

CarstenHa schrieb:

Ahh, ich glaube, ich habe es verstanden. Das Leerzeichen wird als Suchmuster genommen und die brace expansion UND der Dateiname liste.txt als Dateien. Danke 😀

Nein, sicher nicht.

Unmaskierte Leerzeichen in der Shell werden als Options-/Argumenttrenner ohne weitere Bedeutung interpretiert.

Wenn Du nach Leerzeichen greppen willst, musst Du sie maskieren,

1
2
3
grep " " a.txt
grep \  b.txt 
grep ' ' c.txt 

Beachte, dass in Zeile 2 2 Leerzeichen stehen, denn

1
grep \ b.txt 

Würde nach dem Suchmuster " b.txt" greppen, und da keine Datei angegeben wurde, auf Input auf Stdin warten (die Tastatur).

rklm Team-Icon

Projektleitung

Anmeldungsdatum:
16. Oktober 2011

Beiträge: 12527

Man kann so etwas auch nett mit dem Skript args.sh auf meiner Nutzerseite debuggen:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
$ args.sh grep -eN{82..99} ./liste.txt
arg count: 20
arg[1]: 'grep'
arg[2]: '-eN82'
arg[3]: '-eN83'
arg[4]: '-eN84'
arg[5]: '-eN85'
arg[6]: '-eN86'
arg[7]: '-eN87'
arg[8]: '-eN88'
arg[9]: '-eN89'
arg[10]: '-eN90'
arg[11]: '-eN91'
arg[12]: '-eN92'
arg[13]: '-eN93'
arg[14]: '-eN94'
arg[15]: '-eN95'
arg[16]: '-eN96'
arg[17]: '-eN97'
arg[18]: '-eN98'
arg[19]: '-eN99'
arg[20]: './liste.txt'
$ args.sh grep -e N{82..99} ./liste.txt
arg count: 21
arg[1]: 'grep'
arg[2]: '-e'
arg[3]: 'N82'
arg[4]: 'N83'
arg[5]: 'N84'
arg[6]: 'N85'
arg[7]: 'N86'
arg[8]: 'N87'
arg[9]: 'N88'
arg[10]: 'N89'
arg[11]: 'N90'
arg[12]: 'N91'
arg[13]: 'N92'
arg[14]: 'N93'
arg[15]: 'N94'
arg[16]: 'N95'
arg[17]: 'N96'
arg[18]: 'N97'
arg[19]: 'N98'
arg[20]: 'N99'
arg[21]: './liste.txt'

Oder Du schaltest bei der interaktiven Shell mal bit set -x die Debugausgaben an.

Antworten |