-2

我对 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

目前它还打印出标题(## 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

谢克里斯林

4

1 回答 1

2

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

你可以使用这个awk

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

p遇到时会设置标志1,遇到时## 6.1会重置## 6.2

要与也打印文件名的通配符一起使用:

awk -F, '/^## 6\.1 /{p=1; next} /^## 6\.2 /{p=0}
  p && NF > 1{print FILENAME ":", $0}' *
于 2020-07-13T21:21:10.337 回答