每次在文件中找到特定字符串时如何删除一定数量的行

每次在文件中找到特定字符串时如何删除一定数量的行

每次在文件中找到字符串时,我想删除前 1 行和后 10 行。

foo.txt:

} Name: john Line 3 Line 4 Line 5 Line 6 Line 7 Line 8 Line 9 Line 10 Line 11 Line 12 Apple orange grape pine } Name: Ruben Line Line Line Line Line Line Line Line Line Line grape zebra donkey } Name: Tom Line Line Line Line Line Line Line Line Line Line Tiger red blue orange tomato cat }

期望Out.txt

Name: john Apple orange grape pine Name: Ruben grape zebra donkey Name: Tom Tiger red blue orange tomato cat

我想用sednawk.花括号和 Name: 之后的接下来的 10 行应该消失。将 Solaris 5.10 与ksh.

答案1

使用 awk

$ awk '/}/{next;} /Name:/{print;n=NR+10} NR>n' file
Name: john
Apple
orange
grape
pine
Name: Ruben
grape
zebra
donkey
Name: Tom
Tiger
red
blue
orange
tomato
cat

怎么运行的

  • /}/{next;}

    跳过任何包含}.

  • /Name:/{print;n=NR+10}

    当我们到达包含 的行时,打印它,然后设置为 10 加当前行号,Name:以便我们知道何时再次开始打印。n

  • NR>n

    如果当前行号大于n,则执行默认操作:打印该行。

使用 sed

具有非常相似的逻辑:

$ sed -e '/}/d' -e '/Name:/{p;N;N;N;N;N;N;N;N;N;N;d;}' file
Name: john
Apple
orange
grape
pine
Name: Ruben
grape
zebra
donkey
Name: Tom
Tiger
red
blue
orange
tomato
cat

怎么运行的

  • /}/d

    删除任何包含}.

  • /Name:/{p;N;N;N;N;N;N;N;N;N;N;d;}

    如果我们找到包含 的行Name:,打印它,然后读入接下来的 10 行并删除它们。

打印不属于上述任一类别的行。

相关内容