【问题标题】:Grep Regex - Words in brackets?Grep Regex - 括号中的单词?
【发布时间】:2012-11-08 03:42:20
【问题描述】:

我想知道 grep 中的正则表达式来匹配所有不是特定单词的内容。我知道如何不匹配不是单个字符的所有内容,

gibberish blah[^.]*jack

只要中间不包含句点,它将匹配 blah、jack 和介于两者之间的所有内容。但是有可能做这样的事情吗?

gibberish blah[^joe]*jack

匹配 blah、jack 和介于两者之间的所有内容,只要中间不包含单词“joe”?

更新: 如果更适合此目的,我也可以使用 AWK。

所以基本上,我只想得到句子“gibberish blah other words jack”,只要“joe”不在其他词中。

更新 2(另一个问题的答案):

对不起,我累了。该句子实际上可以包含单词“joe”,但不能包含两个。因此,“胡言乱语 blah jill joe moo jack”会被接受,但“胡言乱语 blah jill joe moo joe jack”不会被接受。 无论如何,我想出了解决问题的方法。只需 grep 搜索“gibberish.*jack”,然后计算字数 (wc) 以查看该句子中有多少“joes”。如果 wc 返回 1,则可以,但如果返回 2 或更多,则该句子是错误的。

所以,很抱歉提出一个甚至无法解决我的问题的问题。我会将 sputnick 的答案标记为正确的答案,因为他的答案看起来可以解决原始帖子的问题。

【问题讨论】:

  • 不,正则表达式不允许您这样做。方括号内的东西是一个set。没有办法否定 BRE 或 ERE 中的原子。虽然你也许可以在 PCRE 中做到这一点。
  • 这个不清楚。它应该首先匹配“blah”还是“blahish”? oO
  • @sputnick 你说得对,但不清楚。我会编辑它。
  • 你测试过grep -v,就像我在我的帖子中解释的那样吗?

标签: regex grep


【解决方案1】:

您要查找的内容名为环顾,这是pcreperl 中的高级regex 技术。它用于现代语言。如果您有 -P 开关, 可以处理此表达式。如果您没有-P,请尝试使用pcregrep。 (或任何现代语言)。

注意

如果您只想否定regex,也许一个简单的grep -v "regex" 就足够了。 (这取决于您的需求):

$ echo 'gibberish blah other words jack' | grep -v 'joe'
gibberish blah other words jack
$ echo 'gibberish blah joe other words jack' | grep -v 'joe'
$ 

man grep | less +/invert-match

【讨论】:

    【解决方案2】:

    尝试否定的lookbehind语法:

    blahish blah(?<!joe)*jack
    

    【讨论】:

    • 仅在 PCRE 中。 OP 没有说他使用的是什么形式的 RE。最好限定技术特定的答案。
    • OP 提到了 grep。因此,这可能不是一个有效的答案。另一方面,Perl 确实有一个 grep 函数 ;)
    • 对不起,我在标题中说 grep。我也应该在帖子中澄清。是的,我正在使用 grep。
    猜你喜欢
    • 1970-01-01
    • 2016-05-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-12-12
    • 2017-09-03
    • 2011-06-11
    • 1970-01-01
    相关资源
    最近更新 更多