回答:
~
実際にオペレータの一部であり、=~
その右側に拡張正規表現への左にある文字列の正規表現マッチを行います。
[[ "string" =~ pattern ]]
文字列は引用符で囲む必要があり、正規表現は引用符で囲まないでください。
同様の演算子がPerlプログラミング言語で使用されています。
によって理解される正規表現bash
は、GNU grep
が-E
フラグで理解する正規表現、つまり正規表現の拡張セットと同じです。
多少話題から外れていますが、知っておくと便利です。
キャプチャグループを含む正規表現と照合する場合、各グループによってキャプチャされた文字列の一部がBASH_REMATCH
配列で利用可能です。この配列の0番目/最初のエントリは、置換コマンド(またはPerl)の置換&
パターンに対応します。これはパターンに一致する文字列のビットであり、インデックス1以降のエントリは、などに対応します。。置換パターン(またはPerl ではなど)、つまり各括弧で一致したビット。sed
$&
\1
\2
sed
$1
$2
例:
string=$( date +%T )
if [[ "$string" =~ ^([0-9][0-9]):([0-9][0-9]):([0-9][0-9])$ ]]; then
printf 'Got %s, %s and %s\n' \
"${BASH_REMATCH[1]}" "${BASH_REMATCH[2]}" "${BASH_REMATCH[3]}"
fi
これは出力するかもしれません
Got 09, 19 and 14
現在の時間が09:19:14である場合。
配列名のREMATCH
ビットは、BASH_REMATCH
「正規表現一致」、つまり「RE-Match」に由来します。
非bash
Bourne風のシェルではexpr
、制限された正規表現のマッチングにも使用できます(基本的な正規表現のみを使用)。
小さな例:
$ string="hello 123 world"
$ expr "$string" : ".*[^0-9]\([0-9][0-9]*\)"
123
grep -E
は、GNUシステムでのみ、パターンとして引用されていない変数を使用する場合にのみ理解されるものと同じです[[ $var = $pattern ]]
([[ 'a b' =~ a\sb ]]
vsを参照p='a\sb'; [[ 'a b' =~ $p ]]
)。また、シェルの引用はRE演算子の意味に影響を与え、REの処理に影響を与える可能性のあるシェルのトークン化には一部の文字を引用する必要があることに注意してください。[[ '\' =~ [\/] ]]
falseを返します。ksh93
さらに悪い問題があります。zsh
シェルとREのクォートが明確に分離されている場合の賢明なアプローチについては(またはbash 3.1)を参照してください。の[
組み込みzsh
および演算子yash
もあり=~
ます。
off-topic
!+1(
[[ "This is a fine mess." =~ T.........fin*es* ]]; [[ "This is a fine mess." =~ T.........fin\*es\* ]]
。または、引用符*
も一致しますか?[[ "This is a fine mess." =~ "T.........fin*es*" ]]
。
[[ a =~ .* ]]
または[[ a =~ '.*' ]]
あるいは[[ a =~ \.\* ]]
、同じ.*
REが渡される=~
演算子。OTH、でbash
、[[ '\' =~ [)] ]]
エラーを返し、あなたがいるかどうか、それをしようとせず知っているだろう[[ '\' =~ [\)] ]]
試合?どうでしょう[[ '\' =~ [\/] ]]
(ksh93で行います)。どうですかc='a-z'; [[ a =~ ["$c"] ]]
(=
オペレータと比較して)?参照してください:[[ '\' =~ [^]"."] ]]
あなたがすることができるという誤った...注意を返すshopt -s compat31
にbash
取得するためにzsh
行動を。
zsh
/ bash -o compat31
の動作[[ a =~ '.*' ]]
も[ a '=~' '.*' ]
(を[
サポートする実装の=~
場合)またはexpr a : '.*'
。OTOH、[[ a = '*' ]]
vs とは一致しません[[ a = * ]]
(ただし、globはシェル言語の一部ですが、REはそうではありません)。
[[ expression ]]
セクションの下にあるbashのmanページを読んでください。
An additional binary operator, =~, is available, with the same precedence as == and !=. When it is used, the string to the right of the operator is considered an extended regular expression and matched accordingly (as in regex(3)).
ロングストーリーショートは、=~
同じように、オペレータである==
と!=
。右側の文字列の実際の正規表現とは関係ありません。
=~
実生活での使用を示すいくつかの例を理解できますか...?
man [[ expresssion ]]
そしてman [[
何も返しません。 内部bashコマンドhelp [[
から有用な情報を返します[[
が、=~
基本または拡張正規表現構文のどちらを使用するかは述べていません。quote引用したテキストは、bashのマニュアルページからのものです。「bashのマニュアルページを読む」と言っていたことがわかりますが、最初は、bash内のマニュアルページを読むことを意味すると思いました。とにかく、man bash
4139行(72ページ)の巨大なファイルを返します。を押すと検索できます/▒▒▒
が、正規表現を使用しますが、そのフレーバーは(=~
たとえば)指定されていません。