在正则表达式组中,大写字母的Sed无法正常工作。

3

我来翻译一下:

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'

@Lutz 这不会花费 AB_C。 - Amitesh
所以你正在搜索具有下划线的大写单词,然后再用它们自己替换它们?你表达式中的第一对括号捕获这样的单词。我不明白问题。你只想匹配这样的单词还是也想替换这样的单词? - divesh premdeep
@diveshpremdeep 我正在使用管道,我没有展示整个指令。 - nervosol
我跟随您提供的链接进入了regexpal网站。在页面顶部,它写着“regexpal 0.1.4 - 一个JavaScript正则表达式测试工具”。遗憾的是,几乎每个实现正则表达式的工具都有所不同。 - glenn jackman
3个回答

4
那个正则表达式在传统的sed中不被支持。你可以使用带有PCRE标志的grep -oP
s='abc abc Abc ABC AB_C'
grep -oP '([A-Z]+(_?[A-Z]+)+)' <<< "$s"
ABC
AB_C

1
PCRE => Perl 兼容正则表达式 - anubhava
1
“普通”的grep命令应该是 grep -o '\<[A-Z]\+\(_[A-Z]*\)*\>'。我会使用 [[:upper:]] 代替 [A-Z] - glenn jackman

1

默认情况下,sed 使用 BRE。这意味着您必须转义具有特殊含义的字符,例如 + (...) 以使它们具有特殊含义。

如果您使用 GNU sed,则可以使用 -r 选项使 sed 使用 ERE

希望这对您有所帮助。


1
@PsychoData 基本正则表达式。ERE=扩展的正则表达式 - Kent

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
    

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接