私はgrep
で同じ正規表現を使用しますが、一致しますが、bashスクリプトで実行すると一致しません。
テスト文字列(ファイル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
しかし、このbashスクリプトは一致を返しません。
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"'
のような文字列(単一引用符も囲む)が見つかります。 シェルスクリプトの「=〜」演算子の意味 を参照してください。
また、正規表現内の特殊文字(引用符、スペース、シェルリダイレクト-<
)をエスケープする必要があります。
#!/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
この場合、grep
に-q
オプションを使用して、標準出力に何も書き込まず、一致するものが見つかったらすぐに終了しました。
[[ "$page" =~ '<img src="[^"]*\.jpg"' ]]
と書くと、右側は正規表現ではなく通常の文字列として扱われます。 Bash regex statement を参照してください。解決策は、すべての 特殊文字 をエスケープすることです。
そうでない場合は、単一引用符''
のような別の変数で正規表現ステートメントを使用できます。
var='<img src="[^"]*\.jpg'
この場合、特殊文字を1つずつエスケープする必要はありません。
#!/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
ステートメントにコメントしました。 bashの単一引用符と二重引用符 の違い。