Grep kompletter Name inklusive Punkt im Wort

Grep kompletter Name inklusive Punkt im Wort

In einem kshShell-Skript verwende ich einen grepBefehl, 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.123unddef.jkl

Der Wert wird nicht abgerufen, nachdem: .Gibt es eine andere Möglichkeit, grepdieses Wort zu finden? Ich kenne auch nicht das genaue Wort, sondern grepnur ein Muster. Ich arbeite an kshder Shell.

Antwort1

Sieht so aus, als ob Sie nur die Zeichenfolge defund 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 \Sbedeutet keine Leerzeichen und wird von GNU grepmit den Flags -Eoder unterstützt -P.

Antwort2

Verwenden grep -ovon 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 defund 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 -Fden generierten Zeilen angewendet, um die Zeilen zu finden, an denen Sie interessiert sind.


Ihr Muster, \wdef\wdas bei GNU grep, wenn POSIX-Zeichenklassennamen verwendet werden, dasselbe ist wie [[:alnum:]_]def[[:alnum:]_], erfordert, dass die Zeichenfolge defauf 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 -oFlag von grepgibt nur den definierten übereinstimmenden Regex-Teil zurück. Außerdem \wist es keine POSIX-definierte Erweiterung für grepund 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 -PFlag aktiviert den PCRE-Regex-Modus in GNU grepund -ogibt das ganze Wort zurück, das dem definierten Regex entspricht. Der Regex wird übersetzt als „Entspricht null oder mehr alphanumerischen Zeichen, gefolgt von defeinem 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 -oimmer noch eine GNU-Erweiterung ist

grep -o '\([[:alnum:]]*\)def[.]\([[:alnum:]]*\)' 

verwandte Informationen