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 regreseOVS/sdasd/asdasd/asdasd/something.img
¿Cómo lo uso grep
para que funcione?
Lo intenté grep -P "(?<=\[')[^,]*"
pero devuelve toda la línea.
Respuesta1
Agregue el -o
modificador para que grep
solo devuelva lo que coincida con el patrón que está buscando:
$ grep -Po "(?<=\[')[^,]*" data.txt
OVS/sdasd/asdasd/asdasd/something.img
Respuesta2
También puede utilizar sed
sin la aserción de búsqueda para una mayor portabilidad ( -o
puede que no esté disponible para su grep
):
sed "s!['\(\[^,\]*\),.*\$!\1!;t;d;p" data.txt
Tenga en cuenta el uso "extraño" de escapes de barra invertida aquí. Se debe al hecho de que sed
utiliza BRE de forma predeterminada (consulteesta pregunta).
Hablando de portabilidad, ¿por qué no utilizar simplemente Perl?
perl -nle "print \$1 if /\['([^,]*)/" data.txt
Respuesta3
@slm ya te dio la respuesta canónica. Aquí hay algunas opciones más:
Utilice awk
y '
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
Utilice 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