grep并删除字符串上方的两行

时间:2014-05-09 23:16:11

标签: perl grep

我有一个类似下面的文件。

我想grep一个字符串说cde并找到它上面的两行并在同一个文件中删除(类似perl -i)。

abc
abc
cde
fgh
lij
lij
klm
mno
pqr
pqr

我试过

grep -B 2 "cde" a.txt

输出

abc
abc
cde

但现在我要删除cde上方的两行,以便我的最终输出为

cde
fgh
lij
lij
klm
mno
pqr
pqr

我试过了

grep -v -B  "cde" a.txt

但它不起作用

2 个答案:

答案 0 :(得分:1)

in perl one-liner

perl -ne 'push @b, $_; @b = () if /^cde$/; print shift @b if @b == 3; END { print @b }' file.txt

答案 1 :(得分:0)

这是awk解决方案。

awk 'FNR==NR {if (/cde/) f=NR;next} FNR!=f-1 && FNR!=f-2' file{,} > tmp && mv tmp file
cde
fgh
lij
lij
klm
mno
pqr
pqr

file{,}file file相同。让awk两次读取文件。
首次查找cde并将其存储在变量f中 如果记录不是-1或-2,则第二次打印与发现相比较 > tmp && mv tmp file将输出存储在tmp文件中,然后写回原始文件,例如-i