2017-01-04 9 views
1

文字列に複数の(+)記号が含まれていて、それをキャプチャする必要がある場合、[]内にどのように入れることができますか?sedの(+)記号と特殊文字の一致式

comp_arg=`echo $element | sed -nr 's/.*-c([a-zA-Z0-9_-+]*)<\/text>.*/\1/p'`; 

問題が[]内部+が作動し、次のようにエラーを報告しないことである。

sedの:-e式#1、CHAR 38:無効な範囲の端

答えて

1

問題は+の中に[...]が含まれていないため、エスケープされていない-(またはハイフン)が最初または最後の位置にないためです。文字クラスの途中にエスケープされていない-がそれを範囲にします。あなたのケースでは、+がASCIIテーブルの_の前に来るので、無効な-+の間の範囲を確立しようとしています。

代わりにこれを試してみてください:

sed -nr 's/.*-c([a-zA-Z0-9_+-]*)<\/text>.*/\1/p' 
0

問題が+としなければならないが、-と数量詞の表現の中に置かれていません。これはそこの特別な記号であり、ある範囲の要素と一致するようにしようとします。したがって、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 
関連する問題