regex ищут работы с 'grep-E', но не со сценарием удара?

Я использую тот же regex с grep и это дает мне соответствие, но при выполнении его в сценарии удара, он не возвращает соответствия.

Тестовая Строка (часть файла 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>

Эта команда правильно соответствует выделенной части (и еще много):

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

Но этот сценарий удара не возвращает соответствия:

page=$(<testregex.txt)

if [[ $page =~ '<img src="[^"]*\.jpg"' ]]; then
    echo $1
    echo "match found"
else
    echo "match not found!"
fi
4
задан 3 April 2014 в 10:18

2 ответа

В случае =~ оператор, просто не используйте кавычки для правильного оператора. Это считают расширенным регулярным выражением так в этом случае, одинарные кавычки будут частью от него регулярное выражение. Так, с помощью одинарных кавычек будет найдена строка как '<img src="/thumbs/os_x_lynx-t1.jpg"' (которые содержат также одинарные кавычки вокруг этого). См. Иметь в виду “ = ~ оператор ” в сценарии оболочки .

кроме того, Вы должны для выхода из любого специального символа в regex (кавычки, пробелы, перенаправление оболочки - <):

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

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

Независимо =~, можно использовать в сценарии исходную команду, которая использует grep:

#!/bin/bash

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

В этом случае я использовал -q опция для grep, чтобы не записать что-либо в стандартный вывод и сразу выйти, если соответствие найдено.

4
ответ дан 17 November 2019 в 14:06

Если Вы запишете [[ "$page" =~ '<img src="[^"]*\.jpg"' ]], то правую сторону будут рассматривать как обычную строку, не regex. См. Bash regex оператор . Решение состоит в том, чтобы выйти весь эти специальные символы .

иначе можно использовать regex оператор в отдельной переменной в одинарных кавычках '' как,

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

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

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

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

я прокомментировал echo $1 оператор. Различие в одинарные и двойные кавычки в ударе .

3
ответ дан 17 November 2019 в 14:06

Другие вопросы по тегам:

Похожие вопросы: