我有一个大文件,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
。看起来像一个错误。而且它不能是脚本的最后一个命令(另一个错误))。