Grep Wortgrenzen

22

Zugriff auf die GNU-Dokumentation:

‘\<’ Match the empty string at the beginning of word.
‘\>’ Match the empty string at the end of word.

Meine / etc / fstab sieht so aus:

/dev/sdb1       /media/fresh      ext2   defaults     0 0

Ich möchte, dass grep TRUE / FALSE für die Existenz von / media / fresh zurückgibt. Ich habe versucht , zu verwenden \<und , \>aber es hat nicht funktioniert. Warum?

egrep '\</media/fresh\>' /etc/fstab

Problemumgehung:

egrep '[[:blank:]]/media/fresh[[:blank:]]' /etc/fstab

Sieht aber hässlicher aus.

Mein grep ist 2.5.1

Felipe Alvarez
quelle
4
Ich nehme an, dass /es kein Wortzeichen ist, also passt Regex nicht zusammen - "\ b passt vor und nach einer alphanumerischen Sequenz" ist genauer als "vor und nach einem Wort" zu sagen
Felipe Alvarez

Antworten:

27

\<und \>stimmen mit leerer Zeichenfolge am Anfang bzw. Ende eines Wortes überein, und nur wortbestandteilende Zeichen sind:

[[:alnum:]_]

Von man grep:

Word-constituent characters are letters, digits, and the underscore.

Ihr Regex scheitert also, weil /es sich nicht um ein gültiges Wort handelt.

Anstelle von Leerzeichen können Sie die -wOption verwenden grep, um ein Wort zu suchen:

grep -wo '/media/fresh' /etc/fstab

Beispiel:

$ grep -wo '/media/fresh' <<< '/dev/sdb1       /media/fresh      ext2   defaults     0 0'
/media/fresh
heemayl
quelle
Ich rechne so viel, nachdem ich meine Frage gepostet habe. Irgendwelche Vorschläge für das, was ich erreichen möchte?
Felipe Alvarez
@ FelipeAlvarez Überprüfen Sie meine Änderungen ..
heemayl
1

Dieses Problem mit \<(und auch \b) betrifft nicht nur /alle Nicht-Wort-Zeichen. (dh andere Zeichen als [[:alnum:]]und _.)

Das Problem ist, dass die Regex-Engine immer ein Nicht-Wort-Zeichen umgeht, wie /bei der Suche nach dem nächsten Anker \<. Aus diesem Grund sollten Sie keine Nicht-Wort-Zeichen wie /direkt danach einfügen \<. Wenn Sie dies tun, wird konstruktionsbedingt nichts zusammenpassen.

Eine Alternative zur -wOption grep wäre etwa Folgendes:

egrep "(^|\W)/media/fresh($|\W)"
SE
quelle