Условие регулярного выражения Bash - PullRequest
8 голосов
/ 03 марта 2011

У меня есть регулярное выражение, которое мне нужно проверить.Регулярное выражение содержит двойные кавычки, но я не могу понять, как правильно их избежать.

Первая попытка не работает, поскольку кавычки не экранированы.

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)

Как я могу правильно запустить это, чтобы вывод link.html без двойных кавычек.

Я пытался ...

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

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

Без удачи.Может кто-нибудь, пожалуйста, помогите мне, чтобы я мог перестать биться головой о стол?Я не очень хорош с Башом.Спасибо!

Ответы [ 4 ]

10 голосов
/ 04 марта 2011

Всегда лучше поместить ваше регулярное выражение в переменную.

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 голосов
/ 03 марта 2011
$line =~ "<a href=\"(.+)\">HTTP</a>" 
1 голос
/ 08 июня 2011

Я рекомендую всегда использовать переменную при указании регулярного выражения:

#!/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>
0 голосов
/ 03 марта 2011

Попробуйте это "<a href="""(.+)""">HTTP</a>"

Редактировать, попробуйте это

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

или

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

или

'<a href='\"'(.+)'\"'>HTTP</a>' <- это даст правильный синтаксис в Bash, что касается регулярного выражения (. +), Не знаю, как это будет играть </p>

Редактировать, что вы получаете, когда используете это регулярное выражение "<a href=(.+)>HTTP</a>" ??

...