在“pattern2”最后一次出现之后删除第一次出现“pattern1”的行?

Dav*_*avy 3 sed awk

我有一个包含这种内容的文件:

bla bla
模式2
bla bla
模式
1
bla
bla 模式1 bla
bla
模式1

我想以粗体删除整行,即包含pattern1最后一次匹配后的第一次出现pattern2

有人有想法吗?

谢谢 !

Wil*_*ard 5

这是一个ex单线。(ex是 的前身和脚本形式vi。)

printf '%s\n' '$?pattern2?/pattern1/d' x | ex file.txt
Run Code Online (Sandbox Code Playgroud)

x保存并退出。将其更改为%p,如果你只想打印改变的文件,但保存更改(良好的测试)。

$表示文件的最后一行;?pattern2?是一个地址,表示pattern2从当前位置开始向后搜索的第一个结果;/pattern1/是前向搜索地址,d是行删除命令。

使用ex时,你需要向前和向后寻址。


你可以在vi或 Vim 中以交互方式做同样的事情:

vim file.txt
Run Code Online (Sandbox Code Playgroud)

然后,键入

:$?pattern2?/pattern1/d
Run Code Online (Sandbox Code Playgroud)

并按 Enter。

然后保存并按:xEnter退出。