Adicione a opção -o
para que grep
retorne apenas o que corresponde ao padrão que você está procurando:
$ grep -Po "(?<=\[')[^,]*" data.txt
OVS/sdasd/asdasd/asdasd/something.img
Estou usando esse regex (?<=\[')[^,]*
em um arquivo que contém a seguinte linha disk = ['OVS/sdasd/asdasd/asdasd/something.img, w']
Eu quero que retorne OVS/sdasd/asdasd/asdasd/something.img
Como uso o grep
para que ele funcione?
Eu tentei grep -P "(?<=\[')[^,]*"
, mas ele retorna toda a linha.
Você também pode usar sed
sem a asserção lookaround para maior portabilidade ( -o
pode não estar disponível para seu grep
):
sed "s!['\(\[^,\]*\),.*\$!!;t;d;p" data.txt
Observe o uso "estranho" de barras invertidas aqui. É devido ao fato de que sed
usa BREs por padrão (consulte esta questão ).
Falando de portabilidade, por que não apenas usar o Perl?
perl -nle "print \ if /\['([^,]*)/" data.txt
@slm já deu a você a resposta canônica. Aqui estão mais algumas opções:
Use awk
e '
como delimitador de campo (supondo que todas as linhas tenham o mesmo formato):
$ awk -F "'" '($1~/ = /){print $2}'
OVS/sdasd/asdasd/asdasd/something.img, w
Faça tudo em perl:
$ perl -lne 'print $1 if /\[.(.*?).\]/' data.txt
OVS/sdasd/asdasd/asdasd/something.img, w
Use um regex mais simples e analise os 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/.*\[.\(.*\).\]//'
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
Tags grep regular-expression