如何将包含未闭合引号的文字字符串与 ripgrep 匹配?

如何将包含未闭合引号的文字字符串与 ripgrep 匹配?

我有一个包含一些 python 代码的文件。有一行包含以下内容(包括引号)

'hello "value"'

我想'hello "value"在文件中搜索。请注意未关闭的报价。我使用 ripgrep 和以下命令:

rg -F 'hello "value"

上述命令不适用于'hello "value"bash/zsh 中的输入。我想要的只是字面匹配。我已经使用了该标志F,但由于输入字符串中未闭合引号,它根本不起作用。我还尝试将输入括在单/双引号内,如下所示:

rg -F "'hello "value""或者rg -F ''hello "value"'

上面的方法也不起作用。

我认为该 F标志会告诉 ripgrep 按字面意思考虑输入?我该如何解决?

答案1

文本'hello "value" 从外壳上看以单引号开始并且永远不会结束。您将收到一个继续提示($PS2通常是>),询问字符串的其余部分。

要搜索类似的内容,您需要从 shell 中转义引号(两种类型),您可以这样做

"'hello \"value\""

或者,如果您不想转义所有文字双引号,请引用最初的单引号并将字符串的其余部分保留为单引号

"'"'hello "value"'
^1 ^3            ^4      
  ^2
  • 1-2 包含初始前导单引号的双引号字符串
  • 3-4 包含文字双引号的单引号字符串

如果您有特别复杂的字符串,那么从脚本中读取字符串不会有任何问题,在脚本中可以指示 shell 不要尝试解析它,而不是在命令行上读取字符串。将要尝试解析它

#!/bin/bash
[[ $# -eq 0 ]] && IFS= read -rp "Enter search string: " item
rg -F "${1:-$item}"

使脚本可执行并将其放在$PATH.如果您在命令行上提供某些内容,它将使用它。如果不这样做,它将提示输入字符串,您可以输入任意复杂程度的字符串。


作为脚注,造成混乱的部分原因可能是 Windows/DOS 世界期望程序本身解析命令行。在 UNIX/Linux 世界中情况并非如此,shell 解析命令行并将结果参数传递给命令。没有办法告诉 shell 不要解析命令行 - 这就是它的作用 - 所以你需要使用它或者绕过 shell。相关阅读有如何在shell中转义引号?shell 中的“...”、“...”、$'...' 和 $“...” 引号之间有什么区别? ,其中更详细地解释了引用等。

答案2

如果字符串需要从地狱引用,你可以求助于heredoc给你一条生命线:

rg -Ff - <<\! your_file_python
'hello "value"
!

或者,您可以将所有这些令人讨厌的正则表达式扔进一个文件中,远离 shell 的窥探,并让 ripgrep 通过 -f 文件选项使用它们。

答案3

扩展一下罗艾玛的回答- 如果你使用 Bash,你可以使用 printf 的%q修饰符导致 printf 以可重复用作 shell 输入的格式输出相应的参数。有用的一句台词是:

read -r &&  printf "%q\n" "$REPLY"

按字面意思输入一个字符串,按Return,然后printf将显示一个正确引用的字符串,您可以将其传递给 shell 命令。

例子:

$ read -r &&  printf "%q\n" "$REPLY"
'hello "value"'
\'hello\ \"value\"\'
$ echo \'hello\ \"value\"\'
'hello "value"'

相关内容