linux - 通过 Bash 更改 txt 文件

标签 linux bash awk sed

我有一个文本文件,看起来像

file:/path/to/file
..
..
DA:34,0,0
DA:86,0,0
DA:87,0,0
..
DA:89,0,0
file:/path/to/file
..
DA:23,0,1
..
DA:24,0,1
DA:25,0,1
..

我只想将第一行以“DA”开头的行保留在以“file”开头的行之后。其他以“DA”开头的行必须删除。还有很多其他行(我用“..”标记了它们),它们也需要保留。

结果应如下所示:

file:/path/to/file
..
..
DA:34,0,0
..
file:/path/to/file
..
DA:23,0,1
..
..

有人可以帮我吗?我将非常感激。谢谢

最佳答案

这与 Printing with sed or awk a line following a matching pattern 密切相关.

你所追求的是:

awk '/^file/{f=1}(f&&/^DA/){f=0;print}!/^DA/' file

这是如何工作的?

  • /^file/{f=1}:如果您找到以单词“file”开头的行,请将标记 f 设置为 1
  • (f&&/^DA/){f=0;print}: 如果标志 f 不为零,并且该行以 DA 开头,则打印该行并将标志设置为零。这可确保您只打印 file 之后的第一个 DA
  • !/^DA/:打印所有不以DA开头的行

较短的版本:

awk '/^file/{f=1}(f--&&/^DA/);!/^DA/' file

关于linux - 通过 Bash 更改 txt 文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52833141/

相关文章:

java - 是否可以添加类似 shebang 的东西来使 jar 文件在 Windows 上可执行?

c++ - snprintf 是否可能返回以 '\0' 开头的字符数组?

linux - 将 cat 命令输出保存到文件

bash - 使用 sed 取消注释代码

bash - HandBrakeCLI 命令中断 while 循环?

for-loop - awk for 循环不搜索所有字段

linux - 向 RHEL 5 登录屏幕添加安全消息

Python 脚本未在 crontab 中执行

awk - 根据第一列获取 0 值的范围

regex - Linux命令替换标准输入中没有 '\n'的字符