使用 AWK 删除模式(不包括模式)后的行

delete lines after pattern (excluding pattern) using AWK

我想用 AWK 命令删除模式后的 N 行。

输入file.txt

bla bla
bla bla
pattern
these lines
are not 
requires
I want to delete 
these...
up to nth line
....
....

需要输出file.txt

bla bla
bla bla
pattern

尝试过的解决方案

awk '/pattern/ {exit} {print}' file.txt

我找到了这个命令 here 但我也需要“模式”。 请帮忙!

一个 awk 动作可以有多个语句,所以这样的事情应该有效:

awk '/pattern/ {print; exit} {print}' file.txt

更简单更短的sed:

sed '/pattern/q' file

bla bla
bla bla
pattern

你很接近,你只需要先 print 然后 exit 如果模式匹配。让file.txt内容为

bla bla
bla bla
pattern
these lines
are not 
requires
I want to delete 
these...
up to nth line
....
....

然后

awk '{print}/pattern/{exit}' file.txt

产出

bla bla
bla bla
pattern

(在 GNU Awk 5.0.1 中测试)

切勿在匹配文本的上下文中使用“模式”一词,因为它非常含糊。例如,这些中的每一个都会从您发布的示例输入中产生预期的输出,但意味着非常不同的东西,并且在给定不同输入的情况下彼此的行为会非常不同,您使用的正确输入取决于您所说的“模式”的含义:

完整的正则表达式匹配:

$ awk '{print} /^pattern$/{exit}' file
bla bla
bla bla
pattern

部分正则表达式匹配:

$ awk '{print} /pattern/{exit}' file
bla bla
bla bla
pattern

完整字符串匹配:

$ awk '{print} [=12=]=="pattern"{exit}' file
bla bla
bla bla
pattern

部分字符串匹配:

$ awk '{print} index([=13=],"pattern"){exit}' file
bla bla
bla bla
pattern

还有其他可能性,具体取决于您是需要单词匹配还是行匹配。参见