私は一見簡単に見えることをするために数日間苦労しました。
(LC_ALL=POSIX; regex="src\\.[\\x20-\\x7E]+\\.system"; file="src.dirtree.system";
if [[ $file =~ $regex ]]; then echo "yes"; else echo "no"; fi;)
私たちが望むのはsrc.*.systemと一致することです。ここで、*は文字範囲内の任意のものにすることができます\x21-\x7E
。私が望むなら、それはうまくいくかもしれません\x20-\x7E
が[ -~]+
、この範囲を操作したり、重複した任意の16進エスケープ範囲を操作したりするにはどうすればよいですか*, + or {x,y}
?
Bashのバージョンはです4.3.11(1)-release
。いいえ、変更できません。
答え1
man 3 regex
詳細については、Bashのドキュメントを参照してください。
""と ""
=~
と同じ優先順位を持つ追加の2項演算子""を使用することもできます。使用すると、演算子の右側の文字列は拡張正規表現として扱われ、それに応じて一致します(例:==
!=
正規表現3))。
man 3 regex
次の説明で説明するように、LinuxではこれがPOSIX正規表現であることを示しています。構成フラグこの機能を有効にする必要があります。
--enable-cond-regexp
=~
POSIX正規表現と一致するように、条件付きコマンドでのバイナリ演算子の使用をサポートしています[[
。 (望むより 条件付き構造)。
次のようman 7 regex
に構文を説明します。
これらの文字と「[」(次の段落を参照)を使用する特定の組み合わせを除いて、他のすべての特殊文字(「\」を含む)は角括弧式で特別な意味を失います。
そして、16進バイトの範囲への言及はありません。だから私はそれが直接可能ではないと言いたいと思います。
あなたは乱用することができますANSI C参照関数実際のバイトを16進バージョンに置き換えます。
$ (LC_ALL=POSIX; regex="src\.["$'\x21-\x7E'"]+\.system"; file='src.dir!ree.system'; if [[ $file =~ $regex ]]; then echo "yes"; else echo "no"; fi;)
yes
$ (LC_ALL=POSIX; regex="src\.["$'\x21-\x7E'"]+\.system"; file='src.dir ree.system'; if [[ $file =~ $regex ]]; then echo "yes"; else echo "no"; fi;)
no
$ (LC_ALL=POSIX; regex="src\.["$'\x21-\x7E'"]+\.system"; file="src.dirtree.system"; if [[ $file =~ $regex ]]; then echo "yes"; else echo "no"; fi;)
yes
、(対応するバイトに拡張)とregex
3つの文字列がどのように関連付けられているかを確認してください。"src\."
$'\x21-\x7E'
"]+\.system"
もちろん、この場合は、!-~
適切に引用された内容を使用することができます。
$ (LC_ALL=POSIX; regex='src\.[!-~]+\.system'; file='src.dirtree.system'; if [[ $file =~ $regex ]]; then echo "yes"; else echo "no"; fi;)
yes
$ (LC_ALL=POSIX; regex='src\.[!-~]+\.system'; file='src.dir!ree.system'; if [[ $file =~ $regex ]]; then echo "yes"; else echo "no"; fi;)
yes
$ (LC_ALL=POSIX; regex='src\.[!-~]+\.system'; file='src.dir ree.system'; if [[ $file =~ $regex ]]; then echo "yes"; else echo "no"; fi;)
no
それとも、[[:graph:]]
ASCII文字と同じ範囲でなければならないと思います。