![删除行中第一次出现字符串后的所有行](https://linux22.com/image/9890/%E5%88%A0%E9%99%A4%E8%A1%8C%E4%B8%AD%E7%AC%AC%E4%B8%80%E6%AC%A1%E5%87%BA%E7%8E%B0%E5%AD%97%E7%AC%A6%E4%B8%B2%E5%90%8E%E7%9A%84%E6%89%80%E6%9C%89%E8%A1%8C.png)
我有一个大文件,test.txt
如下例所示:
foo
before ...
before some line
foo something interesting bar
after some lines
after ...
bar
something interesting
如何使用基本 bash 命令(例如sed
or )创建一个仅包含字符串“”第一次出现之前的行的新文件grep
(不是awk
,我需要在没有 awk 的嵌入式设备上使用它)?
答案1
sed '/something interesting/,$d' < file > newfile
可以优化为:
sed -n '/something interesting/q;p' < file > newfile
sed
一旦发现模式就退出。
sed
正如 @RakeshSharma 所指出的,使用 GNU 实现可以简化为
sed '/something interesting/Q' < file > newfile
要就地截断文件,使用ksh93
而不是bash
,您可以执行以下操作:
printf '' <>; file >#'*something interesting*'
<>;
类似于标准<>
重定向运算符(以读+写方式打开),只是如果命令成功,文件将在末尾被截断。<#pattern
寻找与模式匹配的下一行的开头。
(请注意,它似乎可以在 stdout 上工作(至少与 ksh93u+ 一起使用)printf ''
,但不能与其他一些内置命令一起使用,例如true
,:
或eval
。看起来像一个错误。而且它不能是脚本的最后一个命令(另一个错误))。