加号(+)登录sed的特殊字符匹配表达式

时间:2017-01-04 11:40:27

标签: regex bash unix sed

如果字符串包含多个(+)符号并且需要捕获它...如何将其放入[]?

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

问题是+内的[]无法正常工作并报告错误如下:

  

sed:-e expression#1,char 38:无效的范围结束

2 个答案:

答案 0 :(得分:1)

问题不是由于+内的[...],而是由于未转义-(或连字符)不在内部的第一个或最后一个位置。字符类中间的未转义-使其成为范围。在您的情况下,它会尝试在-+之间建立一个范围,该范围无效,因为+位于ASCII表中的_之前。

请改为尝试:

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

答案 1 :(得分:0)

问题与+无关,但-位于量词表达式中。这是一个特殊符号,并尝试匹配一系列元素,因此a-z表示&#34;从a到z&#34;的所有字母。所以说_-+正试图匹配_+之间的所有字符。

如果没有连字符,请查看其工作原理:

$ 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