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

Pet*_*ter 9 shell awk

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

output these
lines

but do not output anything after the above blank line
(or the blank line itself)
Run Code Online (Sandbox Code Playgroud)

AWK?别的什么?

the*_*mis 9

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

but not this
or this
EOF
Run Code Online (Sandbox Code Playgroud)

  • 除了给出代码之外,对其工作方式的一些解释将帮助我们初学者. (4认同)
  • 将其写为“sed -e '/^$/,$d' &lt;file&gt;”可能会更清晰一些。另外,如果您碰巧有大文件(或很多文件),则读取整个文件可能会出现问题。否则,又好又短! (2认同)

eph*_*ent 7

更多awk:

awk -v 'RS=\n\n' '1;{exit}'
Run Code Online (Sandbox Code Playgroud)

更多sed:

sed -n -e '/./p;/./!q'
sed -e '/./!{d;q}'
sed -e '/./!Q'   # thanks to Jefromi
Run Code Online (Sandbox Code Playgroud)

直接在shell中怎么样?

while read line; do [ -z "$line" ] && break; echo "$line"; done
Run Code Online (Sandbox Code Playgroud)

(或者printf '%s\n'代替echo,如果你的shell有问题,并且总是处理逃逸.)

  • 好觉醒!第二个sed可以缩短为''/./!Q'` - `Q`立即退出,不需要自动打印.+1 (2认同)

Cas*_*bel 6

使用 sed:

sed '/^$/Q' <file>
Run Code Online (Sandbox Code Playgroud)

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

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

awk '{if ($0 == "") exit; else print}' <file>
Run Code Online (Sandbox Code Playgroud)

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


gho*_*g74 5

# awk '!NF{exit}1' file
output these
lines
Run Code Online (Sandbox Code Playgroud)