Я использую тот же 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
В случае =~
оператор, просто не используйте кавычки для правильного оператора. Это считают расширенным регулярным выражением так в этом случае, одинарные кавычки будут частью от него регулярное выражение. Так, с помощью одинарных кавычек будет найдена строка как '<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
, чтобы не записать что-либо в стандартный вывод и сразу выйти, если соответствие найдено.
Если Вы запишете [[ "$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
оператор. Различие в одинарные и двойные кавычки в ударе .