Verwendung eines Perl-kompatiblen Regex mit GNU grep -P

10

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

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

Wie verwende ich es grep, damit es funktioniert?

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

GxFlint
quelle

Antworten:

14

Fügen Sie den -oSchalter so hinzu, dass grepnur das zurückgegeben wird, was dem Muster entspricht, nach dem Sie suchen:

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

Sie können auch sedohne die Lookaround-Behauptung für eine bessere Portabilität verwenden ( -omöglicherweise nicht für Ihre verfügbar grep):

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

Beachten Sie, dass hier die "seltsame" Verwendung von Backslash-Escapezeichen auftritt. Dies liegt an der Tatsache, dass sedstandardmäßig BREs verwendet werden (siehe diese Frage ).

Apropos Portabilität, warum nicht einfach Perl verwenden?

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

@slm gab Ihnen bereits die kanonische Antwort. Hier sind einige weitere Optionen:

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

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

Mach das Ganze in Perl:

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

Verwenden Sie eine einfachere Regex 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
terdon
quelle