複数行の文字列が指定されたパターンを含む行で終わっているかどうかを確認したい。
これらのコードは失敗しました。一致しません。
s=`echo hello && echo world && echo OK`
[[ "$s" =~ 'OK$' ]] && echo match
承認された回答:
bash
で 3.2以降、および3.1との互換性が有効になっていない場合( compat31
を使用) オプションまたはBASH_COMPAT=3.1
)、正規表現演算子を引用します(
だけでなく) ただし、 bash
のいずれかを使用します 引用演算子('...'
、 "..."
、 $'...'
、 $ "..."
))それらの特別な意味を削除します。
[[ $var =~ 'OK$' ]]
OK $
を含む文字列にのみ一致します 文字通り(その $
リテラルの$
に一致します )
[[ $var =~ OK$ ]]
OK
で終わる文字列に一致 (その $
文字列の最後に一致するRE演算子です。
これは、変数に格納されている正規表現や、置換の結果にも当てはまります。
[[ $var =~ $regexp ]] # $var matches $regexp
[[ $var =~ "$string" ]] # $var contains $string
シェル構文で引用する必要のある文字(空白、 <
など)があるため、扱いにくくなる可能性があることに注意してください。 、>コード> 、
&コード> 、一致しない場合は括弧)。たとえば、
。{3} <> [)}]&
と照合する場合 正規表現(3文字の後に "<>"
、)
のいずれか または}
および&
)、次のようなものが必要です:
[[ $var =~ .{3}" <> "[})]& ]]
どの文字を引用符で囲む必要があるかわからない場合は、いつでも一時変数を使用できます。これは、コードが bash31
と互換性があることも意味します 、 zsh
またはksh93
:
pattern='.{3} <> [})]&'
[[ $var =~ $pattern ]] # remember *not* to quote $pattern here
これが唯一の方法でもあります( compat31
を使用する以外の方法) オプション(または BASH_COMPAT =3.1
))システムの正規表現の非POSIX拡張演算子を利用できます。
たとえば、<
の場合 多くの正規表現エンジンで使用されている単語の境界として扱われるには、次のものが必要です。
pattern='<word>'
[[ $var =~ $pattern ]]
実行中:
[[ $var =~ <word> ]]
bash
としては機能しません それらのを扱います シェル引用演算子として、
を渡す前にそれらを削除します 正規表現ライブラリに移動します。
ksh93ではさらに悪化することに注意してください。
[[ $var =~ "x.*$" ]]
たとえば、 whatever-xa *
に一致します ただし、 whatever-xfoo
ではありません 。上記の引用は、 *
の特別な意味を削除します 、ただしではありません。
また、 $
。
zsh
動作はより単純です。引用符はそこでの正規表現演算子の意味を変更せず(bash31のように)、より予測可能な動作になります(EREの代わりにPCRE正規表現を使用することもできます( set -o rematchpcre
))。
yash
[[...]]
がありません 構築しますが、その [
ビルトインには=〜
があります 演算子( zsh
にもあります )。そしてもちろん、 [
通常のコマンドであるため、引用符は正規表現演算子の解釈方法に影響を与えることはできません。
また、厳密に言えば、 $ s
3行は含まれていませんが、2行の完全な行とそれに続く未終端の行が含まれています。 hellonworldnOK
が含まれています 。 OK $
で 拡張正規表現、 $
演算子は文字列の最後でのみ一致します 。
3行の文字列 、 hellonworldnOKn
のように (コマンド置換ストリップ all として、コマンド置換では取得できません。 末尾の改行文字)、 $
n
の後に一致します 、つまり OK $
一致しません。
zsh -o pcrematch
を使用 ただし、 $
PCRE_DOLLAR_ENDONLY
を通過しないため、文字列の最後と文字列の最後の改行の前の両方に一致します。 pcre_compile
へのフラグ 。一般に、シェルの変数には末尾の改行文字が含まれていないため、これは悪い考えと見なされる可能性があります。含まれている場合は、通常、データと見なされます。