2011-03-03 16 views
7

Tengo una expresión regular que debo verificar. La expresión regular tiene comillas dobles, pero parece que no puedo encontrar la forma de escapar de ellas.Bash Condición de expresión regular

Primer intento, no funciona ya que las comillas no se escapan.

while read line 
do 
    if [[ $line =~ "<a href="(.+)">HTTP</a>" ]]; then 
    SOURCE=${BASH_REMATCH[1]} 
    break 
    fi 
done < tmp/source.html 

echo "{$SOURCE}" #output = {"link.html"} (with double quotes) 

¿Cómo puedo ejecutar este adecuadamente lo que la salida es link.html sin comillas dobles.

He intentado ...

while read line 
do 
    if [[ $line =~ "<a href=/"(.+)/">HTTP</a>" ]]; then 
    SOURCE=${BASH_REMATCH[1]} 
    break 
    fi 
done < tmp/source.html 

echo "{$SOURCE}" #output = {} 

Sin suerte. ¿Alguien puede por favor ayudarme así puedo dejar de golpear mi cabeza en mi escritorio? No soy genial con Bash. ¡Gracias!

+0

Ha intentado '' \\, es ahora el carácter de escape universales regognized en todo el mundo. – sln

Respuesta

9

Siempre es mejor poner su expresión regular en una variable.

pattern='<a href="(.+)">HTTP</a>' 
while read line 
do 
    if [[ $line =~ $pattern ]]; then 
    SOURCE=${BASH_REMATCH[1]} 
    break 
    fi 
done < tmp/source.html 

echo "{$SOURCE}" #output = {link.html} (without double quotes) 
+2

Impresionante, ¡funcionó! ¡Gracias! – jayem

+0

Gracias, ¿alguna idea de cuál es la diferencia entre ponerlo en una variable y escribirlo directamente en el bloque '[[$ line = ~ pattern]]'? – chw21

+1

@ chw21: al citar el patrón para permitir caracteres como espacios en él, el patrón se tratará como una cadena simple en lugar de una expresión regular y la coincidencia será equivalente a '==' en lugar de '= ~'. Es mucho más fácil y menos complicado hacer citas y escapar en una tarea variable. –

2
$line =~ "<a href=\"(.+)\">HTTP</a>" 
+0

Gracias pero no funcionó. – jayem

0

Prueba este "<a href="""(.+)""">HTTP</a>"

Editar, así probar este

"<a href="\""(.+)"\"">HTTP</a>"

o

'<a href="(.+)">HTTP</a>'

o

'<a href='\"'(.+)'\"'>HTTP</a>' < - esto le dará la sintaxis correcta en Bash, en cuanto a la expresión regular (. +), No saben cómo que jugarán

Editar, ¿qué se obtiene cuando se utiliza esta expresión regular "<a href=(.+)>HTTP</a>" ??

+0

La salida sigue siendo {"link.html"} – jayem

+0

Con los tres, la salida es {} – jayem

1

recomiendo siempre usar una variable cuando se especifica la expresión regular:

#!/bin/bash 

SOURCE= 
url_re='<a href="(.+)">HTTP</a>' 
while read line 
do 
    if [[ "$line" =~ $url_re ]]; then 
     SOURCE=${BASH_REMATCH[1]} 
     break 
    fi 
done < test.txt 

echo $SOURCE # http://example.com/ 

# test.txt contents: 
# <a href="http://example.com/">HTTP</a>