文字列に複数の(+)記号が含まれていて、それをキャプチャする必要がある場合、[]内にどのように入れることができますか?sedの(+)記号と特殊文字の一致式
comp_arg=`echo $element | sed -nr 's/.*-c([a-zA-Z0-9_-+]*)<\/text>.*/\1/p'`;
問題が[]
内部+
が作動し、次のようにエラーを報告しないことである。
sedの:-e式#1、CHAR 38:無効な範囲の端
文字列に複数の(+)記号が含まれていて、それをキャプチャする必要がある場合、[]内にどのように入れることができますか?sedの(+)記号と特殊文字の一致式
comp_arg=`echo $element | sed -nr 's/.*-c([a-zA-Z0-9_-+]*)<\/text>.*/\1/p'`;
問題が[]
内部+
が作動し、次のようにエラーを報告しないことである。
sedの:-e式#1、CHAR 38:無効な範囲の端
問題は+
の中に[...]
が含まれていないため、エスケープされていない-
(またはハイフン)が最初または最後の位置にないためです。文字クラスの途中にエスケープされていない-
がそれを範囲にします。あなたのケースでは、+
がASCIIテーブルの_
の前に来るので、無効な-
と+
の間の範囲を確立しようとしています。
代わりにこれを試してみてください:
sed -nr 's/.*-c([a-zA-Z0-9_+-]*)<\/text>.*/\1/p'
問題が+
としなければならないが、-
と数量詞の表現の中に置かれていません。これはそこの特別な記号であり、ある範囲の要素と一致するようにしようとします。したがって、a-z
は "aからzまでのすべての文字"を意味します。だから_-+
は_
と+
の間のすべての文字を一致させようとしています。
$ echo "hello+bye" | sed -r 's/[a-z+]*//'
# return empty
しかし、我々はハイフンを追加するときに失敗を開始:
が、これはハイフンなしでどのように動作するかを参照してください
$ echo "hello+-bye" | sed -r 's/[a-z-+]*//'
sed: -e expression #1, char 12: Invalid range end
ソリューションを表現の最後にそれを置くことです。
$ echo "hello+-bye" | sed -r 's/[a-z+-]*//'
# return empty