bashのif句内での正規表現の使用


10

ifブロックを見てください:

#!/bin/bash

str="m.m"
if [[ "${str}" =~ "m\.m" ]]; then
    echo "matched"
else
    echo "not matched"
    exit 1
fi

exit 0

これは「一致した」と出力するはずですが、そうではありません。どこがいけないの?

回答:


21

正規表現の一致で引用符を削除する必要があります。

if [[ ${str} =~ m\.m ]]; then

bashのmanページから:

[...]追加の2項演算子=〜が利用可能で、==および!=と同じ優先順位があります。これを使用すると、演算子の右側の文字列は拡張正規表現と見なされ、それに応じて一致します(regex(3)のように)。文字列がパターンに一致する場合、戻り値は0で、一致しない場合は1です。正規表現が構文的に正しくない場合、条件式の戻り値は2です。シェルオプションnocasematchが有効になっている場合、アルファベット文字の大文字と小文字を区別せずに一致が実行されます。 パターンの一部を引用符で囲んで、文字列として一致させることができます。

したがって、引用符では、古き良き文字列マッチングを使用しています。

パターンにスペースが必要な場合は、エスケープするだけです。

str="m   m"
if [[ ${str} =~ m\ +m ]]; then

ただし、二重引用符がないと、正規表現パターンでスペース文字を使用できません。そのための解決策はありますか?
Majid Azimi、2012

1
スペースはのようにエスケープする必要があります\
ДМИТРИЙМАЛИКОВ

動的な数字で終わる文字列を検索する場合は、使用${str} =~ "needle"[0-9]{1}する必要があります${str} =~ needle[0-9]{1}か、それとも使用する必要がありますか?
mgutt
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.