regex search trabalha com 'grep -E' mas não com o script bash?

4

Eu uso o mesmo regex com grep e ele me dá uma correspondência, mas ao fazer isso em um script bash, ele não retorna correspondência.

String de teste (parte do arquivo testregex.txt ):

<a href="/os_x_lynx-wallpapers.html"><p>OS X Lynx</p> <img src="/thumbs/os_x_lynx-t1.jpg" alt="OS X Lynx" class="thumb_img" width="270" height="169"/></a></div><div style="float:right;margin-right:13px;"></div></div>

Este comando corresponde corretamente à parte realçada (e mais alguns):

grep -E '<img src="[^"]*\.jpg"' testregex.txt

Mas este script não retorna correspondência:

page=$(<testregex.txt)

if [[ $page =~ '<img src="[^"]*\.jpg"' ]]; then
    echo 
    echo "match found"
else
    echo "match not found!"
fi
    
por udiboy1209 03.04.2014 / 08:18

2 respostas

4

No caso do operador =~ , apenas não use aspas para o operador certo. Isso é considerado uma expressão regular estendida, portanto, neste caso, aspas simples farão parte da expressão regular. Então, usando aspas simples, uma string como '<img src="/thumbs/os_x_lynx-t1.jpg"' (que contém também aspas simples ao redor) será encontrada. Veja Significado do operador “= ~” no script de shell .

Além disso, você deve escapar de qualquer caractere especial em sua regex (citações, espaços, redirecionamento de shell - < ):

#!/bin/bash
page=$(<testregex.txt)

if [[ $page =~ \<img\ src=\"[^\"]*\.jpg\" ]]; then
    echo 
    echo "match found"
else
    echo "match not found!"
fi

Além de =~ , você pode usar em seu script o comando original que usa grep :

#!/bin/bash

if grep -qE '<img src="[^"]*\.jpg"' testregex.txt ; then
    echo 
    echo "match found"
else
    echo "match not found!"
fi

Nesse caso, usei a opção -q para grep para não gravar nada na saída padrão e sair imediatamente se alguma correspondência for encontrada.

    
por Radu Rădeanu 03.04.2014 / 09:21
3

Se você escrever [[ "$page" =~ '<img src="[^"]*\.jpg"' ]] , o lado direito será tratado como uma string comum, não como um regex. Consulte a declaração de regex do Bash . A solução é escapar de todos os caracteres especiais .

caso contrário, você pode usar a instrução regex em uma variável separada entre aspas simples '' like,

var='<img src="[^"]*\.jpg'

nesses casos, você não precisa escapar de caracteres especiais, um por um.

#!/bin/bash
page=$(<testregex.txt)
var='<img src="[^"]*\.jpg'

if [[ "$page" =~ $var ]]; then
#    echo 
    echo "match found"
else
    echo "match not found!"
fi

Comentei a declaração echo . Diferença em aspas simples e duplas no bash .

    
por souravc 03.04.2014 / 08:47