每次在文件中找到字符串时,我想删除前 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
我想用sed
或nawk
.花括号和 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 行并删除它们。
打印不属于上述任一类别的行。