显示匹配之前的所有文件

Nic*_*oul 91 text-processing

grep --before-context 5 在比赛前显示 5 行。

我想在比赛前展示一切。
这样做grep --before-context 99999999会工作,但它不是很......专业。

如何显示匹配的所有文件?

Mik*_*kel 130

Sed更适合这一点。

做就是了:

sed '/PATTERN/q' FILE
Run Code Online (Sandbox Code Playgroud)

它是这样工作的:

对于每一行,我们看看它是否匹配/PATTERN

  • 如果是,我们打印它并退出
  • 否则,我们打印它

这是最有效的解决方案,因为它一看到PATTERN就退出。如果没有q,sed 将继续读取文件的其余部分,并且不做任何处理。对于大文件,它可以有所作为。

这个技巧也可以用来模拟head

sed 10q FILE
Run Code Online (Sandbox Code Playgroud)

  • 如果我不想打印与模式匹配的行,我该怎么办? (10认同)
  • @tommy.carstensen:`sed '/PATTERN/Q' FILE` 将跳过匹配的行。`Q` 是一个 GNU 扩展,因此它不适用于任何 sed。 (7认同)

gle*_*man 51

打印到并包括匹配项:

awk '{print} /pattern/ {exit}' filename
sed '/pattern/q' filename
Run Code Online (Sandbox Code Playgroud)

最多打印但不包括匹配项:

awk '/pattern/ {exit} {print}' filename
sed '/pattern/Q' filename
Run Code Online (Sandbox Code Playgroud)

  • `Q` 很酷但是 gnu 特定的 afaik,`sed -n '/pattern/!p;//q'` 会更便携。 (14认同)
  • @don_crissti:啊,我明白了——`//` 的意思是“以前的正则表达式”(我认为它的意思是“匹配空字符串”)。我认为相同解决方案的较短版本是:`sed -n '/pattern/q;p` ? (2认同)

for*_*sck 41

sed 可以替代 grep 的大部分功能。

sed -n '1,/<pattern>/ p' <file>
Run Code Online (Sandbox Code Playgroud)

这意味着从第一行打印直到模式匹配。

几个范围示例

sed -n '/<pattern>/,$ p' <file> # from pattern to end of file
sed -n '/<pattern1>/,/<pattern2>/ p' <file> # from pattern1 to pattern2
Run Code Online (Sandbox Code Playgroud)

  • 如果我不想打印与模式匹配的行,我该怎么办? (5认同)
  • 这个命令很好,但你可以做得更好。这样它会读取整个文件,但可以在找到匹配项后立即退出。 (3认同)