如何在PowerShell中转义ACK中的双引号和冒号

如何在PowerShell中转义ACK中的双引号和冒号,powershell,ack,Powershell,Ack,我正在PowerShell中使用Ack版本2.04。我想在文本文件中搜索像“jsonClass”:“Page”(包括引号)这样的文本 我似乎无法正确地引用和转义 ack -c --match '"jsonClass":"Page"' 它在PowerShell中不起作用。我猜ack也在收集单引号 转义双引号会产生无效的正则表达式错误: ack -c --match "\"jsonClass\":\"Page\"" Invalid regex '\': Trailing \ in rege

我正在PowerShell中使用Ack版本2.04。我想在文本文件中搜索像“jsonClass”:“Page”(包括引号)这样的文本

我似乎无法正确地引用和转义

ack -c --match '"jsonClass":"Page"'
它在PowerShell中不起作用。我猜ack也在收集单引号

转义双引号会产生无效的正则表达式错误:

ack -c --match "\"jsonClass\":\"Page\""
  Invalid regex '\':
  Trailing \ in regex m/\/ at C:\CHOCOL~1\lib\ACK2~1.04\content\ack.pl line 315
我也尝试了literal选项,但我认为ack将冒号解释为文件参数

ack -c -Q --match "jsonClass":"Page"
  ack.pl: :Page: No such file or directory
我错过了什么


我正在使用PowerShell v2。

如果
ack
是一个函数,则可能会发生由PowerShell解释
-c
的情况。你能测试一下吗

ack '-c' '--match' '"jsonClass":"Page"'
-c--match
应解释为
--match
是函数
ask
中参数
c
的值

如果是EXE文件,请尝试:

ack -c --match '\"jsonClass\":\"Page\"'
要使用PowerShell v3+解决方案作为补充:

调用外部程序时,例如
ack
,使用所谓的停止解析符号,
-->%
,使PowerShell按原样传递其余参数,但扩展
cmd.exe
样式的环境变量引用(如
%PATH%
)除外:

ack --% -c --match "\"jsonClass\":\"Page\""
允许您只关注目标程序的转义规则,而不必担心与PowerShell自身的解析和转义之间的复杂相互作用

因此,在PowerShell v3或更高版本中,OP自己的第二次解决方案尝试将
-->作为第一个参数传递


请注意,不使用
-->%
(也适用于PSv2,如果希望在其他参数中包含PowerShell扩展变量/表达式,通常非常有用)的上述命令的完全等效项如下所示:

ack -c --match '"\"jsonClass\":\"Page\""'
也就是说,要按原样传递的整个参数都包含在单引号中,这确保PowerShell不会对其进行解释


请注意JPBlanc的回答中没有的内部封闭的
(截至本文撰写时)。它们保证参数最终被
ack
视为单个参数,即使它包含空格。

什么是ack命令/cmdlet/function?@arashzgh我使用的是powerShell 2.0这似乎不是问题。我在简单模式上尝试了-c,但没有引号,它返回了预期结果。
ack-c-Q--match”Page“
ack
是一个Perl脚本/模块。在Perl处理字符串时需要反斜杠。
\'jsonClass\':\'Page\'
\'jsonClass\':'Page\'“
将起作用。@ansgar wiechers是的,我还通过跟踪和错误将第一个模式归零。请将此作为答案发布。回答很好,但为了完全复制原始参数
“\'jsonClass\”:\“Page\”
,我建议将单引号字符串的内容用双引号括起来:
“\'jsonClass\”:\“Page\”
。它与手边的字符串没有区别,它不包含空格,但在其他情况下可能包含空格。要添加到@AnsgarWiechers的说明中:在Windows上,
ack
作为批处理文件(
ack.cmd
)实现,该批处理文件使用脚本
ack.pl
调用
perl.exe
。我使用的是PowerShell v2,上面的转义并没有解决它,因为似乎传递给ack的args也包括backquote@sas1138当前位置我已经改写了答案。现在它只对PSv3+用户有用,但由于您没有将您的帖子标记为仅v2(请保持这种方式),我想我会展示一个PSv3+替代方案,它可能对未来的读者有所帮助。(我最初回答的错误是,我试图修复您的PowerShell解决方案尝试,而不是解决您的原始问题;请注意,回执不会传递到
ack
,但是,因为回执是PS自己的转义字符。)谢谢,我尝试编辑,但我没有足够的权限编辑帖子yet@sas1138但是,您应该始终能够编辑自己的帖子(如果您已登录)。(只是为了修正我之前的评论:我也添加了一个PSv2解决方案。)