![Grep kompletter Name inklusive Punkt im Wort](https://rvso.com/image/154442/Grep%20kompletter%20Name%20inklusive%20Punkt%20im%20Wort.png)
In einem ksh
Shell-Skript verwende ich einen grep
Befehl, um ein bestimmtes Wort zu erhalten, wie unten gezeigt.
$ cat file.txt
abc xyzdef.123 def.jkl mnopqrst
$ grep -o "\wdef\w" file.txt
xyzdef
def
Ich möchte die Ausgabe xyzdef.123
unddef.jkl
Der Wert wird nicht abgerufen, nachdem: .
Gibt es eine andere Möglichkeit, grep
dieses Wort zu finden? Ich kenne auch nicht das genaue Wort, sondern grep
nur ein Muster. Ich arbeite an ksh
der Shell.
Antwort1
Sieht so aus, als ob Sie nur die Zeichenfolge def
und alle sie umgebenden Zeichen außer Leerzeichen möchten. In diesem Fall können Sie Folgendes verwenden:
$ grep -Eo '\S*def\S*' file.txt
xyzdef.123
def.jkl
Das \S
bedeutet keine Leerzeichen und wird von GNU grep
mit den Flags -E
oder unterstützt -P
.
Antwort2
Verwenden grep -o
von POSIX-Zeichenklassen:
grep -o '[^[:blank:]]*def[^[:blank:]]*' file.txt
Das ist im Wesentlichen das, wasterdon schlägt vor, allerdings mit leicht anderer Syntax (und ohne -E
). Dies würde mit der Zeichenfolge def
und allen nicht leeren Zeichen auf beiden Seiten dieser Zeichenfolge übereinstimmen (ein nicht leeres Zeichen ist ein Zeichen, das kein Leerzeichen oder Tabulator ist).
Alternative,
tr '[:blank:]' '\n' <file | grep -F 'def'
Dadurch wird die Zeile einfach in mehrere Zeilen aufgeteilt, eine Zeile pro durch Leerzeichen getrenntes Wort (wobei ein „Leerzeichen“ ein Tabulator- oder Leerzeichen ist). Anschließend wird eine einfache Zeichenfolgenübereinstimmung mit grep -F
den generierten Zeilen angewendet, um die Zeilen zu finden, an denen Sie interessiert sind.
Ihr Muster, \wdef\w
das bei GNU grep
, wenn POSIX-Zeichenklassennamen verwendet werden, dasselbe ist wie [[:alnum:]_]def[[:alnum:]_]
, erfordert, dass die Zeichenfolge def
auf beiden Seiten von einem alphanumerischen Zeichen oder einem Unterstrich flankiert wird. Ein Punkt ist weder ein alphanumerisches Zeichen noch ein Unterstrich.
Das Muster würde auch nicht übereinstimmen def
, wenn es ganz am Anfang oder Ende einer Zeile auftritt.
Antwort3
Mit dem von Ihnen unternommenen Versuch können Sie nicht das ganze zurückzugebende Wort abgleichen. Das -o
Flag von grep
gibt nur den definierten übereinstimmenden Regex-Teil zurück. Außerdem \w
ist es keine POSIX-definierte Erweiterung für grep
und ist möglicherweise nur in den GNU-Versionen verfügbar, die die PCRE-Syntax unterstützen. Darauf könnten Sie Folgendes tun:
grep -oP '(\w*)def[.](\w*)'
Das -P
Flag aktiviert den PCRE-Regex-Modus in GNU grep
und -o
gibt das ganze Wort zurück, das dem definierten Regex entspricht. Der Regex wird übersetzt als „Entspricht null oder mehr alphanumerischen Zeichen, gefolgt von def
einem Literal .
(in Klammern eingeschlossen) und gefolgt von null oder mehr alphanumerischen Zeichen.“
Die Verwendung von POSIX-Zeichenklassen für alphanumerische Zeichen wäre wie folgt. Aber denken Sie daran, dass das Flag -o
immer noch eine GNU-Erweiterung ist
grep -o '\([[:alnum:]]*\)def[.]\([[:alnum:]]*\)'