【问题标题】:Is there a regex to exclude a word list in awk?是否有正则表达式可以在 awk 中排除单词列表?
【发布时间】:2018-06-27 06:09:37
【问题描述】:

在 awk 程序中,我试图从包含 <<<local>>> 的行和包含模式 <<<XXXX>>> 的下一行中选择输入,其中 XXXX 将是除 local 之外的任何其他内容。

<<<local>>>
line1
line2
line3
<<<XXXX>>>

最简单的 awk 代码是

$0=="<<<local>>>",/^<<<XXXX>>>$/ { ··· }

XXXX 应替换为适当的正则表达式以排除local

据我所知,这可以在 python 中完成

(?!local)

在 Korn shell 和其他 shell 中:

!(local)

但我在 regex(7) 手册页中没有发现任何关于此问题的信息。

为了绕过这个障碍,我使用了

$0=="<<<local>>>",/^<<<.+>>>$/ && $0!="<<<local>>>" { ··· }

但我的这个问题的症结在于awk 正则表达式引擎是否以某种方式接受要排除的单词列表,我的意思是,作为word1|word2|word3 的对应物。

【问题讨论】:

  • 虽然信息很有帮助。您能否提供一个实际示例输入和预期输出,以帮助我们更好地理解?
  • 即使line1 也将满足负前瞻,即(?!local)
  • 请输入/输出示例
  • awk 不支持环视。我建议使用标志(stackoverflow.com/questions/38972736/…) 而不是//,// 语法...
  • 它确实提供了。你可以做!/word1/ &amp;&amp; !/word2/ &amp;&amp; !/word3/

标签: regex awk regex-negation


【解决方案1】:

这样就可以了……

awk '/<<<local>>>/{f=1} f; /<<<.*>>>/ && !/<<<local>>>/{f=0}' file

如果您不想终止另一个单词的范围,您可以添加到!/&lt;&lt;&lt;(local|other)&gt;&gt;&gt;/

【讨论】:

    猜你喜欢
    • 2016-05-09
    • 1970-01-01
    • 2013-02-28
    • 2019-04-30
    • 2017-10-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-20
    相关资源
    最近更新 更多