首页 > 解决方案 > 删除与 grep 模式匹配的行

问题描述

我有几个文件,除了一个特定文件之外,我必须删除与 grep 模式和之前的行匹配的行。我可以通过以下方式发现线条:

grep -B1 --exclude="my_specific_file.txt" "my_pattern" *_files.txt /dev/null

我想知道是否可以*_files.txt用 grep 完全删除模式?如果还有其他选择,我很感兴趣。

标签: bashgrep

解决方案


Perl 的救援:

perl -i~ -ne 'BEGIN { $pattern = qr/my_pattern/ }
              if (/$pattern/) { $p = "" }
              else { print $p; $p = $_ }
              print $p if eof && $p !~ /$pattern/;
             ' -- *_files.txt
  • -n逐行读取输入并按后面指定的代码处理每一行-e
  • -i~用脚本的输出替换每个文件,保留旧文件作为~后缀的备份
  • 我们使用变量$p来保留上一行。如果当前行 ( $_) 匹配父行,我们清除前一行,否则,我们打印它并记住当前行。
  • 在每个文件的末尾,我们打印最后一行,除非它应该被跳过。如果没有这个,第一行的模式将删除先前处理的文件的最后一行。

推荐阅读