【问题标题】:plus(+) sign in special character match expression of sedsed 的特殊字符匹配表达式中的加号(+)
【发布时间】: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: 无效范围结束

【问题讨论】:

    标签: regex bash unix sed


    【解决方案1】:

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

    试试这个:

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

    【讨论】:

      【解决方案2】:

      问题与+ 无关,而与- 放在量词表达式中有关。这是其中的一个特殊符号,并尝试匹配一系列元素,因此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
      

      【讨论】:

        猜你喜欢
        • 2016-04-18
        • 1970-01-01
        • 2021-11-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-05-26
        相关资源
        最近更新 更多