如何用awk删除文件的一部分

1 shell scripting awk text

我正在编写一个shell脚本,它在某些时候必须获取一个文件,在其中搜索一个特定的单词并删除该单词后面的整个文本(包括单词本身) - awk是我认为正确的工具,但我对它的编程知之甚少.

谁能帮助我?

Jon*_*ler 8

我认为'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版本,则可以使用各种非标准扩展来帮助对文件进行原位修改.