【发布时间】:2011-11-24 13:08:57
【问题描述】:
我需要使用“sed”找到一个匹配项并删除该匹配项之前的 2 行和之后的 3 行,然后打印输出,我该怎么做?
【问题讨论】:
我需要使用“sed”找到一个匹配项并删除该匹配项之前的 2 行和之后的 3 行,然后打印输出,我该怎么做?
【问题讨论】:
如果文件不是很大,试试这个:
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
我没有测试,但应该可以。
【讨论】:
首先,您不想在 sed 中执行此操作。 2nd,你的问题是错误的:如果你在第 5 行和第 8 行有匹配,你会怎么做?第 8 行是否被删除而第 6 行被保留?假设这不是问题,这似乎可以满足您的要求:
#!/bin/sed -nf 1{h; d; } H 2,5d G /^\([^\n]*\n\)\{2\}匹配/!P /^\([^\n]*\n\)\{2\}匹配/{ s/\n[^\n]*$// ñ } s/[^\n]*\n// H $p注意:如果匹配出现在文件的最后 3 行,则其行为不符合预期。该案例留给(受虐狂)读者作为练习。
【讨论】:
sed ‘/matchWord/,+3d;:flag;1,2!{P;N;D};N;bflag’ file
【讨论】: