Sed大写字母在regex组中不起作用

时间:2014-02-12 13:38:41

标签: regex bash sed

我有文字:

  

abc abc Abc ABC AB_C

我希望用大写字母和破折号匹配单词(这不是强制性的)。

我的解决方案是:

[A-Z]+(_{0,1}[A-Z]+)+

它适用于regexpal.com,但不适用于sed。我做错了什么?

sed 's/\([A-Z]+(_{0,1}[A-Z]+)+\)/\1/g'

3 个答案:

答案 0 :(得分:4)

传统的sed不支持正则表达式。您可以使用grep -oP(带有PCRE标志)

s='abc abc Abc ABC AB_C'
grep -oP '([A-Z]+(_?[A-Z]+)+)' <<< "$s"
ABC
AB_C

答案 1 :(得分:1)

默认情况下sed使用BRE。这意味着,你必须逃脱具有特殊含义的字符,如+ ( ...。 “给予”他们特殊的意义。

如果您使用的是gnu sed,则可以使用-r选项使sed使用ERE

希望这有用。

答案 2 :(得分:0)

您可以通过两种方式实现:

  1. 使用过滤小写字母:

    $ echo 'abc abc Abc ABC AB_C' | sed "s/\s/\n/g" | sed '/[a-z]/d' 
    ABC
    AB_C
    
  2. 不使用

    $ echo 'abc abc Abc ABC AB_C' | sed "s/\s/\n/g" | grep "^[A-Z][A-Z_]*$"
    ABC
    AB_C