我正在尝试编写一个简短的脚本来查找空行,然后打印空行之后的第 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