Anmelden

Archiv verlassen und diese Seite im Standarddesign anzeigen : Shell - Maskierung



colt
02-11-2004, 22:13
Hallo Leute!

Ich habe eine einfache Frage, auf die ich bis jetzt leider keine Antwort finden konnte.

Wenn ich z.B. mit

ls -l | grep '\.'

Dateien und Verzeichnisse ausgeben will, in denen ein Punkt vorkommt, wieso muß ich dann zusätzlich zu den beiden
einfachen Hochkommata noch einen Backslash vor den Punkt setzen?

Lasse ich den Backslash weg, so werden auch Zeilen ausgegeben in denen kein Punkt vorkommt.

Eigentlich sollten die Hochkommata doch reichen, damit die Shell (bei mir die bash) nix mehr interpretiert?

Danke schonmal :)

michael.sprick
02-11-2004, 22:40
Du hast Recht - Hochkommata ' sorgen dafür, das der enthaltene String nicht interpoliert wird.
In Deinem Fall ist '\.' allerdings ein Parameter für grep.
grep behandelt das Ganze wie einen Regulären Ausdruck und hier hat der Punkt eine ganz andere Bedeutung.

Der . steht für jedes beliebige Zeichen, außer newlines, also sowohl das Zeichen '.' , wie auch jedes andere.

Wenn du den . allerdings mit einem Backslash maskierst, wird aus dem Metazeichen . nun ein einfacher Punkt, den es zu suchen gilt ;)

ls -1 | grep '.'

findet also alle Zeilen, die ein beliebiges Zeichen enthalten.

ls -1 | grep '\.'
findet alle Zeilen, die einen '.' (Punkt) enthalten...

hth, michael

colt
02-11-2004, 23:12
Ok, alles klar, danke!

Joghurt
03-11-2004, 17:07
ls -1 | grep \\.
wäre auch eine Möglichkeit gewesen (\\ wird von der Shell in \ umgewandelt an grep "übergeben")

RapidMax
03-11-2004, 20:22
Oder ein einfaches

ls | fgrep .
Da fgrep (grep -F) keine regulären Ausdrücke sucht.

Gruss, Andy