我需要使用“sed”找到匹配并在此匹配前删除2行,然后删除3行,并打印输出,我该怎么做?
答案 0 :(得分:2)
如果文件不大,请尝试:
awk 'NR==FNR{if($0~/matchWord/){for(i=NR-2;i<=NR+3;i++){if(i!=NR)a[i]++}}}\
NR>FNR{if(!(FNR in a))print $0}' file file
我没有测试,但应该工作。
答案 1 :(得分:2)
首先,你不想在sed中这样做。 2,你提出的问题不对:如果你在5号线和8号线上有比赛,你会怎么做?第8行是否被删除,第6行被保留?假设这不是一个问题,这似乎做你想要的:
#!/bin/sed -nf 1{ h; d; } H 2,5d g /^\([^\n]*\n\)\{2\}match/!P /^\([^\n]*\n\)\{2\}match/{ s/\n[^\n]*$// N } s/[^\n]*\n// h $p
注意:如果匹配发生在文件的最后3行中,则表示不符合要求。这种情况留给了(受虐狂)读者的练习。