Usando um regex compatível com perl com o GNU grep -P


10

Estou usando esse regex (?<=\[')[^,]*em um arquivo que contém a seguinte linhadisk = ['OVS/sdasd/asdasd/asdasd/something.img, w']

Quero que volte OVS/sdasd/asdasd/asdasd/something.img

Como uso greppara fazê-lo funcionar?

Eu tentei, grep -P "(?<=\[')[^,]*"mas ele retorna toda a linha.

Respostas:


14

Adicione a -oopção para que grepapenas retorne o que corresponde ao padrão pelo qual você está esperando:

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

6

Você também pode usar sedsem a asserção de lookaround para maior portabilidade ( -opode não estar disponível para o seu grep):

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

Observe o uso "estranho" da barra invertida aqui. Isso se deve ao fato de sedusar BREs por padrão (consulte esta pergunta ).

Falando em portabilidade, por que não usar apenas Perl?

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

2

O @slm já deu a resposta canônica. Aqui estão mais algumas opções:

Use awke 'como delimitador de campo (assumindo que todas as linhas tenham o mesmo formato):

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

Faça a coisa toda 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/.*\[.\(.*\).\]/\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
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.