Utilizzando un regex compatibile perl con GNU grep -P


10

Sto usando questo regex (?<=\[')[^,]*su un file contenente la seguente rigadisk = ['OVS/sdasd/asdasd/asdasd/something.img, w']

Voglio che ritorni OVS/sdasd/asdasd/asdasd/something.img

Come posso usarlo grepper farlo funzionare?

Ci ho provato grep -P "(?<=\[')[^,]*"ma restituisce l'intera riga.

Risposte:


14

Aggiungi lo -oswitch in modo che greprestituisca solo ciò che corrisponde allo schema per cui stai cercando:

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

6

È inoltre possibile utilizzare sedsenza l'asserzione lookaround per una maggiore portabilità ( -opotrebbe non essere disponibile per il proprio grep):

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

Nota qui lo "strano" uso di backslash. È dovuto al fatto che sedutilizza BREs per impostazione predefinita (vedi questa domanda ).

A proposito di portabilità, perché non usare solo Perl?

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

2

@slm ti ha già dato la risposta canonica. Ecco alcune altre opzioni:

Usa awke 'come delimitatore di campo (supponendo che tutte le righe abbiano lo stesso formato):

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

Fai tutto in perl:

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

Usa una regex più semplice e analizza i risultati:

$ 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
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.