Verwenden eines Perl-kompatiblen regulären Ausdrucks mit GNU grep -P

Verwenden eines Perl-kompatiblen regulären Ausdrucks mit GNU grep -P

Ich verwende diesen regulären Ausdruck (?<=\[')[^,]*auf einer Datei, die die folgende Zeile enthältdisk = ['OVS/sdasd/asdasd/asdasd/something.img, w']

Ich möchte, dass das zurückkehrtOVS/sdasd/asdasd/asdasd/something.img

Wie kann ich grepes zum Laufen bringen?

Ich habe es versucht grep -P "(?<=\[')[^,]*", aber es gibt die ganze Zeile zurück.

Antwort1

Fügen Sie den -oSchalter hinzu, sodass grepnur das zurückgegeben wird, was dem von Ihnen gesuchten Muster entspricht:

$ grep -Po "(?<=\[')[^,]*" data.txt 
OVS/sdasd/asdasd/asdasd/something.img

Antwort2

Sie können es sedfür eine bessere Portabilität auch ohne die Lookaround-Assertion verwenden ( -oist für Ihr Gerät möglicherweise nicht verfügbar grep):

sed "s!['\(\[^,\]*\),.*\$!\1!;t;d;p" data.txt

Beachten Sie hier die „seltsame“ Verwendung von Backslash-Escapezeichen. Dies liegt daran, dass sedstandardmäßig BREs verwendet werden (siehediese Frage).

Apropos Portabilität: Warum verwenden Sie nicht einfach Perl?

perl -nle "print \$1 if /\['([^,]*)/" data.txt

Antwort3

@slm hat Ihnen bereits die kanonische Antwort gegeben. Hier sind noch ein paar weitere Optionen:

Verwenden Sie awkund 'als Feldtrennzeichen (vorausgesetzt, alle Zeilen haben dasselbe Format):

$ awk -F "'" '($1~/ = /){print $2}'
OVS/sdasd/asdasd/asdasd/something.img, w    

Machen Sie das Ganze in Perl:

$ perl -lne 'print $1 if /\[.(.*?).\]/' data.txt 
OVS/sdasd/asdasd/asdasd/something.img, w    

Verwenden Sie einen einfacheren regulären Ausdruck und analysieren Sie die Ergebnisse:

$ grep "\[.*\]" data.txt | awk -F "'" '{print $2}'
OVS/sdasd/asdasd/asdasd/something.img, w
$ grep -o "\[.*\]" data.txt | perl -pe "s/[\[\]']//g"
OVS/sdasd/asdasd/asdasd/something.img, w
$ grep "\[.*\]" data.txt | sed 's/.*\[.\(.*\).\]/\1/'
OVS/sdasd/asdasd/asdasd/something.img, w
$ grep "\[.*\]" data.txt | perl -pne 's/.*\[.(.*?).\].*/$1/'
OVS/sdasd/asdasd/asdasd/something.img, w
$ grep "\[.*\]" data.txt | perl -lne 'print $1 if /\[.(.*?).\]/'
OVS/sdasd/asdasd/asdasd/something.img, w

verwandte Informationen