【问题标题】:awk 3 consecutive empty lines as the match patternawk 3 个连续的空行作为匹配模式
【发布时间】:2015-04-04 21:39:05
【问题描述】:

我需要使用 3 个连续的空行作为匹配模式。以下示例在“rain”和“sun”之间有 3 个空行。

例子:

cat
flower


rabbit
grass
rain



sun

以下代码不起作用:

/\n\n\n/ {print "3 consecutive empty lines found"}

或者

/^$\n^$\n^$\n/ {print "3 consecutive empty lines found"}

或者

/^$^$^$/ {print "3 consecutive empty lines found"}

或者

/'^$'\n'^$'\n'^$'\n/ {print "3 consecutive empty lines found"}

我的 bash 版本是 3.2

【问题讨论】:

  • 您到底想达到什么目的?可能有更好的工具来完成这项工作。
  • awk 通过基于记录分隔符(默认为 \n)分成几行来读取文件,因此您将无法像这样一次性测试多行。您需要对连续的空行进行某种滚动计数。 (编辑:就像刚才说的答案..)
  • 鉴于您正在编写一个 awk 脚本,为什么要告诉我们 bash 版本而不是 awk 版本? awk 版本很重要,bash 版本对这个问题很有用,因为它知道你开什么样的车。无论如何 - 执行此操作的正确方法将取决于您的预期输出,所以请发布它。

标签: awk match


【解决方案1】:

以下内容可能会有所帮助:

awk '/^$/{if(++i>2){print "3 consecutive empty lines found";exit}}/./{i=0}'

使用/^$/,我们计算连续空行的数量。如果我们发现/./ 的非空行,我们将计数器设置为零。如果计数器达到 3,我们打印我们的消息并退出。

【讨论】:

  • 非常感谢!在玩了一点之后它对我有用。我使用此模式匹配(3 个连续的空行)作为 3 或 4 个不同模式之一来停止搜索。
【解决方案2】:

您所需要的只是(使用 GNU awk 进行多字符 RS):

BEGIN{RS="^$"} /(^|\n)\n\n\n/ {print "3 consecutive empty lines found"}

但没有向我们展示预期的输出,这只是猜测。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-11
    • 1970-01-01
    • 2016-02-13
    相关资源
    最近更新 更多