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

Har*_*far 5 quoting pattern-matching 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 按原样考虑输入的标志,使用 ripgrep 字面搜索字符串也如此神秘?我如何解决它?

roa*_*ima 12

'hello "value" shell 看到的文本单引号开头,永远不会结束。你会得到一个继续提示($PS2,经常>),要求输入字符串的其余部分。

要搜索这样的东西,你需要从 shell 中转义引号(两种),你可以这样做

"'hello \"value\""
Run Code Online (Sandbox Code Playgroud)

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

"'"'hello "value"'
^1 ^3            ^4      
  ^2
Run Code Online (Sandbox Code Playgroud)
  • 1-2 包含首字母单引号的双引号字符串
  • 3-4 包含文字双引号的单引号字符串

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

#!/bin/bash
[[ $# -eq 0 ]] && IFS= read -rp "Enter search string: " item
rg -F "${1:-$item}"
Run Code Online (Sandbox Code Playgroud)

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


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

  • 相关 https://unix.stackexchange.com/questions/30903/how-to-escape-quotes-in-shell 和 https://unix.stackexchange.com/questions/503013/what-is-the-difference-between -the-and-quotes-in-th (3认同)
  • @HarisMuzaffar 答案更新以提供命令行处理的替代方案 (3认同)

gue*_*t_7 5

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

rg -Ff - <<\! your_file_python
'hello "value"
!
Run Code Online (Sandbox Code Playgroud)

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

  • 这种对“cat”的无用使用似乎比大多数“更”无用:您已经在“rg”命令行中明确提到了“-”,而使用“cat”只会让您再次提及它。`&lt;&lt;!` 可以出现在 `rg` 命令中的任何位置,例如 `rg -Ff - &lt;&lt;! 你的文件Python` (2认同)