我有一个包含一些 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"'