(
我想使用搜索括号ack
,但既不使用(
也不\(
工作。
第一个(“ (
”)被识别为多行命令。第二个 (" \(
") 被视为无效的正则表达式。
如何使用 搜索括号字符ack
?
错误信息
% ack foo\(
Invalid regex 'foo(':
Unmatched ( in regex; marked by <-- HERE in m/foo( <-- HERE / at /usr/local/bin/ack line 332.
答案1
要搜索括号字符,请将反斜杠+括号传递给 ack。
反斜杠和括号在 shell 中都是特殊的,因此在 shell 脚本或命令行中输入它们时需要引用它们。最简单的引用形式是使用单引号:这告诉 shell 按字面意思传递除单引号本身之外的所有内容。
ack '\('
您还可以使用反斜杠来保护特殊字符免受 shell 扩展的影响,但它的可读性往往较差:
ack \\\(
第一个反斜杠引用 shell 中的第二个反斜杠,因此参数的第一个字符ack
是\
。第三个反斜杠引用括号,因此参数的第二个字符ack
是(
。与上面单引号的情况一样,ack
看到的参数是两个字符的字符串\(
。
ack (
不起作用,因为 shell 看到左括号并将其视为 shell 语法。ack \(
不起作用,因为 shell(
作为参数传递给ack
,并且 ack 将正则表达式中的括号解释为指示组的开始。
答案2
我不知道你得到的确切错误,但这里它使用转义括号(“ \(
”)
$ cat > test.c <<EOF
int main() {
return 0;
}
EOF
$ ack '\(' test.c
int main() {
$