Shell:获取第一个空行之前的所有行的简单方法

发布于 2024-08-09 02:05:00 字数 190 浏览 3 评论 0原文

在遇到第一个空行之前输出文件行的最佳 shell 命令是什么?例如:

output these
lines

but do not output anything after the above blank line
(or the blank line itself)

awk?还有别的东西吗?

What's the best shell command to output the lines of a file until you encounter the first blank line? For example:

output these
lines

but do not output anything after the above blank line
(or the blank line itself)

awk? something else?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(8

落花浅忆 2024-08-16 02:05:00

另一个 Perl 解决方案:

perl -00 -ne 'print;exit' file
perl -00 -pe 'exit if $. == 2' file

Another Perl solution:

perl -00 -ne 'print;exit' file
perl -00 -pe 'exit if $. == 2' file
哑剧 2024-08-16 02:05:00
# awk '!NF{exit}1' file
output these
lines
# awk '!NF{exit}1' file
output these
lines
神回复 2024-08-16 02:05:00

awk解决方案

awk '/^$/{exit} {print} ' <filename>

Awk solution

awk '/^$/{exit} {print} ' <filename>
弥枳 2024-08-16 02:05:00

使用 sed:

sed '/^$/Q' <file>

编辑:sed 速度更快。请参阅 ephemient 的答案以获得最快的版本。

要在 awk 中执行此操作,您可以使用:

awk '{if ($0 == "") exit; else print}' <file>

请注意,我故意编写此内容以避免使用正则表达式。我不知道 awk 的内部优化是什么样的,但我怀疑直接字符串比较会更快。

With sed:

sed '/^$/Q' <file>

Edit: sed is way, way, way faster. See ephemient's answer for the fastest version.

To do this in awk, you could use:

awk '{if ($0 == "") exit; else print}' <file>

Note that I intentionally wrote this to avoid using regular expressions. I don't know what awk's internal optimizations are like, but I suspect direct string comparison would be faster.

少女情怀诗 2024-08-16 02:05:00

更多awk

awk -v 'RS=\n\n' '1;{exit}'

更多sed

sed -n -e '/./p;/./!q'
sed -e '/./!{d;q}'
sed -e '/./!Q'   # thanks to Jefromi

直接在shell 中怎么样?

while read line; do [ -z "$line" ] && break; echo "$line"; done

(或者如果您的 shell 有问题并且始终处理转义,则使用 printf '%s\n' 而不是 echo。)

More awk:

awk -v 'RS=\n\n' '1;{exit}'

More sed:

sed -n -e '/./p;/./!q'
sed -e '/./!{d;q}'
sed -e '/./!Q'   # thanks to Jefromi

How about directly in shell?

while read line; do [ -z "$line" ] && break; echo "$line"; done

(Or printf '%s\n' instead of echo, if your shell is buggy and always handles escapes.)

不弃不离 2024-08-16 02:05:00
sed -e '/^$/,$d' <<EOF
this is text
so is this

but not this
or this
EOF
sed -e '/^$/,$d' <<EOF
this is text
so is this

but not this
or this
EOF
好倦 2024-08-16 02:05:00

一些 Perl 行话

$ perl -pe'last if /^$/' file..

$ perl -lpe'last unless length' file..

A couple of Perl one-liners

$ perl -pe'last if /^$/' file..

$ perl -lpe'last unless length' file..
未央 2024-08-16 02:05:00

这是使用 Perl 的解决方案:

#! perl

use strict;
use warnings;

while (<DATA>) {
    last if length == 1;
    print;
}

__DATA__
output these
lines

but don't output anything after the above blank line
(or the blank line itself)

Here's a solution using Perl:

#! perl

use strict;
use warnings;

while (<DATA>) {
    last if length == 1;
    print;
}

__DATA__
output these
lines

but don't output anything after the above blank line
(or the blank line itself)
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文