【发布时间】:2017-05-18 16:36:16
【问题描述】:
如果字符串包含多个 (+) 符号并且需要捕获它..如何将它放在 [] 中?
comp_arg=`echo $element | sed -nr 's/.*-c([a-zA-Z0-9_-+]*)<\/text>.*/\1/p'`;
问题是+ 内的[] 不起作用并报告如下错误:
sed: -e 表达式 #1, char 38: 无效范围结束
【问题讨论】:
如果字符串包含多个 (+) 符号并且需要捕获它..如何将它放在 [] 中?
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
【讨论】: