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

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

我有一个大文件,test.txt如下例所示:

foo
before ...
before some line 
foo something interesting bar
after some lines
after ...
bar

something interesting如何使用基本 bash 命令(例如sedor )创建一个仅包含字符串“”第一次出现之前的行的新文件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。看起来像一个错误。而且它不能是脚本的最后一个命令(另一个错误))。

相关内容