我需要使用 sed 查找匹配项并删除该匹配项之前的 2 行和之后的 3 行

发布于 2024-12-18 00:15:54 字数 61 浏览 0 评论 0原文

我需要使用“sed”找到一个匹配项,并删除该匹配项之前的 2 行和之后的 3 行,然后打印输出,我该怎么做?

I need to find a match using "sed" and deletes 2 lines before this match and 3 lines after it, and print the output , how can i do that ?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

叹倦 2024-12-25 00:15:54

如果文件不大,请尝试以下操作:

    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

我没有测试,但应该可以工作。

if the file is not huge, try this:

    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

I didn't test, but should work.

画骨成沙 2024-12-25 00:15:54

首先,您不想在 sed 中执行此操作。第二,你的问题提出得不好:如果第 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 行中,则不会按预期运行。这个案例留给(受虐狂)读者作为练习。

First off, you do not want to do this in sed. 2nd, your question is ill posed: what do you do if you have a match on lines 5 and 8? Does line 8 get deleted and line 6 is kept? Assuming that's not a concern, this seems to do what you want:

#!/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

Note: if the match occurs in the last 3 lines of the file, this does not behave as desired. That case is left as an exercise for the (masochistic) reader.

冧九 2024-12-25 00:15:54
sed ‘/matchWord/,+3d;:flag;1,2!{P;N;D};N;bflag’ file
sed ‘/matchWord/,+3d;:flag;1,2!{P;N;D};N;bflag’ file
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文