在一行中第一次出现字符串后删除所有行

rub*_*o77 6 sed text-processing

我有一个test.txt像这个例子这样的大文件:

foo
before ...
before some line 
foo something interesting bar
after some lines
after ...
bar
Run Code Online (Sandbox Code Playgroud)

如何something interesting使用基本的 bash 命令(例如sedor grep(不是awk,我需要在没有 awk 的嵌入式设备上使用它)在第一次出现字符串“ ”之前创建一个新文件?

Sté*_*las 11

sed '/something interesting/,$d' < file > newfile
Run Code Online (Sandbox Code Playgroud)

可以优化为:

sed -n '/something interesting/q;p' < file > newfile
Run Code Online (Sandbox Code Playgroud)

sed尽快找到模式退出。

sed正如@RakeshSharma 所指出的,使用 GNU 实现可以简化为

sed '/something interesting/Q' < file > newfile
Run Code Online (Sandbox Code Playgroud)

要就地截断文件,使用ksh93代替bash,您可以执行以下操作:

printf '' <>; file >#'*something interesting*'
Run Code Online (Sandbox Code Playgroud)
  • <>;就像标准的<>重定向操作符(以读+写方式打开),只是如果命令成功,文件会在最后被截断。
  • <#pattern 寻找与模式匹配的下一行的开头。

(请注意,它似乎适用于(至少使用 ksh93u+)printf ''标准输出,但不适用于其他一些内置命令,例如true,:eval。看起来像一个错误。它也不能是脚本的最后一个命令(另一个错误))。