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

9

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.

    
por GxFlint 02.10.2013 / 20:40

3 respostas

12

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
    
por 02.10.2013 / 20:45
5

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
    
por 02.10.2013 / 21:17
2

@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
    
por 02.10.2013 / 21:06