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)
如果您有特别复杂的字符串,那么您从脚本中读取字符串没有任何问题,可以指示 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 中的“...”、'...'、$'...' 和 $“...” 引号之间有什么区别? ,它更详细地解释了引用引号等。
如果字符串需要从地狱引用,你可以求助于heredoc给你一条生命线:
rg -Ff - <<\! your_file_python
'hello "value"
!
Run Code Online (Sandbox Code Playgroud)
或者,您可以将所有这些令人讨厌的正则表达式扔进一个文件中,远离 shell 的窥探,并让 ripgrep 通过 -f 文件选项使用它们。