Usar una expresión regular compatible con Perl con GNU grep -P

10

Estoy usando esta expresión regular (?<=\[')[^,]*en un archivo que contiene la siguiente líneadisk = ['OVS/sdasd/asdasd/asdasd/something.img, w']

Quiero que eso regrese OVS/sdasd/asdasd/asdasd/something.img

¿Cómo lo uso greppara que funcione?

Lo intenté grep -P "(?<=\[')[^,]*"pero devuelve toda la línea.

GxFlint
fuente

Respuestas:

14

Agregue el -ointerruptor para que grepsolo devuelva lo que coincide con el patrón que está buscando:

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

También puede usar sedsin la afirmación de búsqueda para una mayor portabilidad ( -opuede no estar disponible para su grep):

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

Tenga en cuenta el uso "extraño" de la barra invertida escapa aquí. Se debe al hecho de que sedutiliza BRE de forma predeterminada (consulte esta pregunta ).

Hablando de portabilidad, ¿por qué no usar Perl?

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

@slm ya te dio la respuesta canónica. Aquí hay algunas opciones más:

Use awky 'como delimitador de campo (suponiendo que todas las líneas tengan el mismo formato):

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

Haz todo en perl:

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

Use una expresión regular más simple y analice los resultados:

$ 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
fuente