删除多个文件中的模式后的行

时间:2016-10-11 20:01:58

标签: regex perl unix grep exec

我有以下命令

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

它运行良好并删除了模式,但是如何删除模式,它所在的行以及之后的n行?

3 个答案:

答案 0 :(得分:1)

拿一个档案:

aaa
bbb
ccc
ddd
eee
fff

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

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

0悄悄逐段

的文件

答案 1 :(得分:1)

它比优雅更蛮力,但我认为这将删除具有匹配模式的线和跟随它的线。

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

答案 2 :(得分:0)

这是一个文件的perl答案。我不希望任何发现此问题的人都没有意识到你所包含的find也会编辑隐藏文件。

<强>答案:

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

<强>解释

perl -ni会读取并替换input-file,但只有在指示

时打印

$ml=$. if /<pattern>/$ml匹配的行变量设置为$.,这是输入文件的当前行

print unless (defined $ml && $.<=$ml+[n])将打印除匹配行和[n]下一行

之外的每一行