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=]}' *
我对 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=]}' *