【问题标题】:How to skip lines between two patterns with awk?如何用awk跳过两个模式之间的行?
【发布时间】:2020-03-02 06:44:16
【问题描述】:

使用\hello 开始的一行被跳过

awk '/\\hello/{next}'

如何编辑上面的命令以跳过 \hello 和 \hello2 之间的行?

输入

text
\hello
text
hi
\hello2
text2

想要的输出:

text
text2

【问题讨论】:

  • 如果没有 \hello2 怎么办 - 是否应该打印以 \hello 开头的文本。并且没有模式 - 如果您在谈论字符串或正则表达式,请始终说明。

标签: awk


【解决方案1】:

在其not recommended way 中,您可以执行以下操作:

$ awk '/^\\hello$/,/^\\hello2$/{next}1' file

更好、适应性更强的方式是:

$ awk '/^\\hello$/{f=1}(f==0){print};/^\\hello2$/{f=0}' file

这也是可约的:

$ awk '/^\\hello$/{f=1}!f;/^\\hello2$/{f=0}' file

或查看 Ed Morton 的评论(见下文)

【讨论】:

  • 为什么不推荐使用 regex range pattern 表达式?它在man 1 awk 中提供? (请参阅 "Patterns" 标题下的 pattern1,pattern2)并且受 gawk 和 POSIX awk 支持。
  • [\\] 只是 "\\"
  • @DavidRankin-ReinstateMonica 见stackoverflow.com/questions/23934486/…
  • FWIW:awk '$0=="\\hello"{f=1} !f; $0=="\\hello2"{f=0}' file
  • @EdMorton - 谢谢。这确实增加了使用范围模式的利弊的清晰度。我不得不承认,在这个问题之前,我只考虑了与sed 一起使用的范围模式,并转到手册页以确定它是gawk 有限还是POSIX。 man 1 gawkman 1.p awk 我同意你在这里和这里发布的理性,最好避免范围模式——学习已经发生——这是美好的一天。
猜你喜欢
  • 2013-08-21
  • 2014-09-07
  • 2020-11-02
  • 1970-01-01
  • 2023-01-13
  • 1970-01-01
  • 2019-09-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多