【问题标题】:remove lines after pattern in multiple files删除多个文件中模式后的行
【发布时间】:2017-02-20 11:54:57
【问题描述】:

我有以下命令

find ./ -type f -exec perl -pi -e 's/<pattern>//g' '{}' \;

它运行良好并删除了模式,但我怎样才能删除模式、它所在的行以及之后的 n 行?

【问题讨论】:

  • 每个文件中的模式可以存在两次以上吗?您只想替换 2 个实例吗?
  • 它与 Perl 无关,但与 find:如果你使用 GNU find,那么你可以写 find ./ -type f -exec perl … '{}' + 而不是 find ./ -type f -exec perl … '{}' \;。注意+ 而不是\;。然后find 将一次调用具有多个文件名的perl(与命令行一样多),从而显着减少整体执行时间。
  • @PerlDog 谢谢。它确实显着改善了它。

标签: regex perl unix grep exec


【解决方案1】:

拿一个文件:

aaa
bbb
ccc
ddd
eee
fff

现在,我们想从bbb 删除到ccc,所以:

perl -i -0pe 's/bbb.*ccc//ms'  file

0 将逐段啜饮文件

【讨论】:

  • 感谢您提供简单的解决方案,但我正在寻找可以同时适用于多个文件的解决方案。
  • 所以把这个perl cmd 添加到你原来的发现中吧?!
  • 在这两种情况下它只删除行的第一部分。因此,如果是s/aaabbbeee.*eeecccfff//ms,它将留下eeefff,并将它们放在一行中。
【解决方案2】:

这比优雅更暴力,但我认为这将删除具有匹配模式的行及其后面的行。

find ./ -type f -exec perl -i -e '$x=0 ; while (<>) {if ($_ =~ /<pattern>/) { $x++; next; }; if ($x) { $x=0; next; }; print "$_";}' {} \;

【讨论】:

  • 谢谢!我确实想删除以下 4 行,那么我该怎么做呢?我想我需要将next 更改为其他内容?
【解决方案3】:

这只是一个文件的 perl 答案。我不希望任何发现此问题的人都没有意识到您将其包装在其中的 find 也会编辑隐藏文件。

答案:

perl -ni -e '$ml=$. if /&lt;pattern&gt;/; print unless (defined $ml &amp;&amp; $.&lt;=$ml+[n])' input-file

说明:

perl -ni 将读取并替换 input-file,但仅在指示时打印

$ml=$. if /&lt;pattern&gt;/ 将匹配行变量$ml 设置为$.,即输入文件的当前行

print unless (defined $ml &amp;&amp; $.&lt;=$ml+[n]) 将打印除匹配的行和下 [n] 行之外的每一行

【讨论】:

  • @Nik 回答你关于另一个答案的问题,删除该行和下一个 4 的解决方案是:find ./ -type f -exec perl -ni -e '$ml=$. if /&lt;pattern&gt;/; print unless (defined $ml &amp;&amp; $.&lt;=$ml+4)' {} +
猜你喜欢
  • 2021-12-28
  • 1970-01-01
  • 2012-09-27
  • 2019-11-05
  • 2016-03-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-09-15
相关资源
最近更新 更多