如何使用sed从匹配开始删除文件中的所有行?

如何使用sed从匹配开始删除文件中的所有行?,sed,Sed,假设我们有一个包含以下内容的文件: alpha beta keyword gamma phi 查找“关键字”模式匹配并删除之后所有行的sed命令是什么?产出将是: alpha beta 类似的命令,sed-n-e'1,/^keyword/p'几乎可以工作,但在输出中保留了“keyword”行 $ sed -n '/keyword/q;p' file alpha beta 一些替代方案考虑使用更一致的方法来控制打印/包含关键字的前后: $ awk '/keyword/{f=1} !f' fi

假设我们有一个包含以下内容的文件:

alpha
beta
keyword
gamma
phi
查找“关键字”模式匹配并删除之后所有行的sed命令是什么?产出将是:

alpha
beta
类似的命令,
sed-n-e'1,/^keyword/p'
几乎可以工作,但在输出中保留了“keyword”行

$ sed -n '/keyword/q;p' file
alpha
beta

一些替代方案考虑使用更一致的方法来控制打印/包含关键字的前后:

$ awk '/keyword/{f=1} !f' file   # = sed -n '/keyword/q;p' file
alpha
beta

$ awk '!f; /keyword/{f=1}' file  # = sed -n 'p;/keyword/q' file
alpha
beta
keyword

$ awk '/keyword/{f=1} f' file    # = sed -n '/keyword/,$p' file
keyword
gamma
phi

$ awk 'f; /keyword/{f=1}' file   # = sed -n '1,/keyword/{d};p' file
gamma
phi
上面的
awk
脚本始终只在找到关键字时设置一个标志,并且您可以通过测试在测试关键字之前或之后是否设置标志来控制打印内容

另一方面,
sed
脚本必须在第2版和第3版之间从简单的测试/打印更改为范围表达式,并为第3版和第4版脚本引入不同的字符/语法,而不是前2版脚本


另请参阅以获取有关在regexp周围打印范围的更多解决方案。

您也可以将其反转,并执行
sed'/keyword/,$d'文件
,但我认为这对于此任务来说效率较低。使用GNU sed:
sed'/keyword/Q'文件
@EtanReisner,你能解释一下为什么效率会低吗?@l'l'l答案中的脚本需要将每一行与
/keyword/
匹配,一旦匹配,它就会退出处理输入文件并退出。反转同样需要将每一行与
/keyword/
匹配,但一旦看到它,它就会继续读取文件的其余部分,检查每一行是否是文件中的最后一行。因此,它只处理比原始数据更多的数据。链接到您的答案也可能是合适的。我知道我把这个问题标记为最喜欢的问题,以便随时准备回答。