如果字符串包含多个(+)符号并且需要捕获它...如何将其放入[]?
comp_arg=`echo $element | sed -nr 's/.*-c([a-zA-Z0-9_-+]*)<\/text>.*/\1/p'`;
问题是+
内的[]
无法正常工作并报告错误如下:
sed:-e expression#1,char 38:无效的范围结束
答案 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