如何通过ack来搜索括号

如何通过ack来搜索括号

(我想使用搜索括号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() {
 $

相关内容