ripgrep:在两次点击之间显示搜索结果

ripgreb: show search result between two hits

我对 ripgreb 很陌生,但对它印象深刻。

我有一个非常特殊的棘手案例,我想知道是否可以完成

假设我有两个降价文件

...
## 5.9 Subheading

plz, plz, plz do NOT find me!

# 6 Heading

## 6.1 subheading

plz, plz, plz FIND me!

## 6.2 subheading

plz, plz, plz do NOT find me!
...

...

## 6.1 subheading

plz, plz, plz FIND me too!

## 6.2 subheading

plz, plz, plz do NOT find me too!
...

是否可以在 ## 6.1## 6.2 中搜索每行超过一个逗号的行?

所以它显示了这样的东西

$rg <magic-search term>

221 plz, plz, plz FIND me!

256 plz, plz, plz FIND me too!


目前只是为了看看

rg '## 6.1' --before-context 0 --after-context 4

但这不会在“## 6.1”之后搜索多个逗号或将搜索限制在

之后

更新

我找到了 ripgrep 的“解决方案”,并把它放在这里:

$rg '## 6.1.*## 6.2' --multiline --multiline-dotall 

220 ## 6.1 subheading
221 plz, plz, plz FIND me!
222 ## 6.2 subheading

255 ## 6.1 subheading
256 plz, plz, plz FIND me too!
257 ## 6.2 subheading

目前它还打印出 headers(## 6.1## 6.2

试图通过做这样的事情来避免这种情况,但这只会删除第一个 # 而不是整行

$rg '(?:(?!## 6.1).)*## 6.2' --multiline --multiline-dotall --pcre2

220 # 6.1 subheading
221 plz, plz, plz FIND me!
222 ## 6.2 subheading

255 # 6.1 subheading
256 plz, plz, plz FIND me too!
257 ## 6.2 subheading

感谢 chriserin

正在将我的评论转换为答案,以便未来的访问者可以轻松找到解决方案。

您可以使用这个 awk:

awk -F, '/^## 6\.1 /{p=1; next} /^## 6\.2 /{p=0} p && NF > 1' file

当我们遇到## 6.1时,标志p将被设置为1,当我们遇到## 6.2时将被重置。

与同时打印文件名的通配符一起使用:

awk -F, '/^## 6\.1 /{p=1; next} /^## 6\.2 /{p=0}
  p && NF > 1{print FILENAME ":", [=11=]}' *