web-dev-qa-db-ja.com

正規表現検索は `grep -E`で動作しますが、bashスクリプトでは動作しませんか?

私は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
4
udiboy1209

=~演算子の場合、正しい演算子に引用符を使用しないでください。これは拡張正規表現と見なされるため、この場合、単一引用符は正規表現の一部になります。そのため、単一引用符を使用すると、'<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オプションを使用して、標準出力に何も書き込まず、一致するものが見つかったらすぐに終了しました。

4
Radu Rădeanu

[[ "$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の単一引用符と二重引用符 の違い。

3
souravc