我有一个类似下面的文件。
我想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
但它不起作用
答案 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