我正在编写一个shell脚本,它在某些时候必须获取一个文件,在其中搜索一个特定的单词并删除该单词后面的整个文本(包括单词本身) - awk是我认为正确的工具,但我对它的编程知之甚少.
谁能帮助我?
我认为'awk'是这项工作的一个工具,不过我觉得'sed'对于这个特定的操作来说更简单.规范有点模糊.简单的版本是:
为此,我使用'sed':
sed '/word/,$d' file
Run Code Online (Sandbox Code Playgroud)
更复杂的版本是:
我可能仍然使用'sed':
sed -n '1,/word/{s/word.*//;p}' file
Run Code Online (Sandbox Code Playgroud)
这颠倒了逻辑.默认情况下它不会打印任何内容,但是对于第1行,直到第一行包含单词,它会替换(在包含单词的行之前没有任何作用),然后打印.
可以用'awk'完成吗?因为'awk'autosplits将输入行转换为单词,并且因为你必须使用函数来进行替换,所以并非完全无足轻重.
awk '/word/ { if (found == 0) {
# First line with word
sub("word.*", "")
print $0;
found = 1
}
}
{ if (found == 0) print $0; }' file
Run Code Online (Sandbox Code Playgroud)
(编辑:将'删除'更改为'找到',因为'删除'是'awk'中的保留字.)
在所有这些示例中,输入文件的截断版本将写入标准输出.要在原位修改文件,您需要使用Perl或Python或类似语言,或者将输出捕获到临时文件中,一旦命令完成,您将复制原始文件.(如果您尝试'脚本文件',则处理空文件.)
有各种早期退出优化可以应用于sed和awk脚本,例如:
sed '/word/q' file
Run Code Online (Sandbox Code Playgroud)
并且,如果您假设使用awk或sed的GNU版本,则可以使用各种非标准扩展来帮助对文件进行原位修改.