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.

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

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

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
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.