In Versionen vor 2.19, GNU grep
‚s -w
würde nur Ein-Byte - Zeichen alnums und Unterstrich (so in UTF-8 - Sprachumgebungen, werden nur die 26 + 26 + 10 + 1 (ASCII Buchstaben, Ziffern und den Unterstrich)) betrachtet als Wortbestandteile. So würde zum Beispiel echo Stéphane | grep -w St
übereinstimmen. Das wurde in 2.19 behoben.
Sie können die Logik jedoch von Hand implementieren:
grep -E '([^[:alnum:]_.]|^)test([^[:alnum:]_.]|$)'
Dies wird test
entweder durch einen Nicht-Wort-Bestandteil oder den Anfang der Zeile und gefolgt von entweder einem nicht-Wort-Bestandteil oder dem Ende der Zeile voraus.
(oben [:alnum:]
stimmen Ziffern und Buchstaben in Ihrem Gebietsschema überein, nicht nur ASCII-Ziffern. Korrigieren Sie das Gebietsschema auf C, wenn Sie nur ASCII-Ziffern möchten.)
Wenn Sie nicht möchten, dass die umgebenden Nicht-Wortbestandteile in die Übereinstimmung einbezogen werden (z. B. weil Sie GNUs verwenden -o
), können Sie diesmal PCRE-Regexps und Look-Around-Operatoren verwenden:
grep -Po '(*UCP)(?<![\w.])test(?![\w.])'
Entfernen (*UCP)
und hinzufügen LC_ALL=C
, damit nur ASCII-Buchstaben und -Ziffern übereinstimmen.
Die Verwendung (*UCP)
zu Beginn eines regulären Ausdrucks teilt der PCRE-Bibliothek mit, dass U̲niC̲ode-Eigenschaften verwendet werden müssen \w
.
Ohne \w
würde es mit den alphanumerischen Zeichen und dem Unterstrich Ihres Gebietsschemas übereinstimmen, jedoch nur für Einzelbyte-Zeichen. Das würde in UTF-8-Gebietsschemas (heutzutage die Norm) nicht funktionieren, in denen nur ASCII-Gebietsschemas übereinstimmen würden. (*UCP)
Damit funktioniert es auch für UTF-8. Es würde auf der Grundlage von PCREs eigener Vorstellung von Zeicheneigenschaften übereinstimmen, die sich möglicherweise von denen Ihres Gebietsschemas unterscheiden, aber auf GNU-Systemen ist dies genauso gut wie die dortigen UTF-8-Gebietsschemadefinitionen, die unvollständig und veraltet sind (zumindest ab 2015-04).