如何在匹配/空行后打印第n行

如何在匹配/空行后打印第n行

我正在尝试编写一个简短的脚本来查找空行,然后打印空行之后的第 n 行。

为了

foo1
foo2
foo3

bar1
bar2
bar3

spam1
spam2
spam3

eggs1
eggs2
eggs3

在空行后每隔第二行打印将导致:

foo2
bar2
spam2
eggs2

我尝试使用 sedsed -n -e "/^$/ {N; N; x; N; p; x; d}"但无法清除保留空间,结果不是我想要的。

答案1

awk '++n == 2; !NF {n = 0}' < your-file

或者:

sed -n '
  n;p
  :1
  /./{
    n;b1
  }' < your-file

答案2

您将第 0 行算作空行,这使得它变得有点困难。如果我们忽略这一点并采用您的字面意思“在空行后每隔一行打印一次”,您可以这样做ex

ex -sc 'g/^$/+2p' -cq filename
  • -s:静音模式(ex实际上是交互式编辑)。
  • -c: 声明要运行的命令
  • g/^$/:运行以下命令G全局所有空行
  • +2p:打印当前行向下两行的行
  • q: 退出命令

要将第 0 行算作空行(但前提是第 1 行不是空行),您必须变得更奇特;您可以ex通过在第 1 行之前插入一个空行,然后过滤第 1-2 行来完成此操作uniq- 但此时您最好使用awk, 来达到您的目的。

答案3

轻松完成perl

$ perl -n -e 'BEGIN {$count=0}; 
              if (/^\s*$/) {$count=0} else {$count++};
              if ($count eq 2) {print}' alexandru.txt 
foo2
bar2
spam2
eggs2

答案4

有一个编码值 2 用于在空行之后打印每第二行。

试一试:

awk 'BEGIN { empty=1; n=0; } { if ($0 ~ /^$/) { empty=1; n=0; } else if (empty) { n++; if (n==2) { empty=0; print; } } }' file.txt

file.txt 是当前目录中要解析的文件的名称。

假设在搜索第 n 行时,每个空行后面总是有 n 行或更多行,对吧?

测试输出如下:

awk 'BEGIN { empty=1; n=0; } { if ($0 ~ /^$/) { empty=1; n=0; } else if (empty) { n++; if (n==2) { empty=0; print; } } }' file.txt
foo2
bar2
spam2
eggs2

----

有一个著名的页面:Sed - Bruce Barnett 的介绍和教程

尝试一下下面的这个版本,它与您的版本非常接近:

sed -n '{
2 {
p
}
/^$/ {n
n
p}}' file.txt

foo2
bar2
spam2
eggs2

相关内容