如何在PowerShell中转义ACK中的双引号和冒号
我正在PowerShell中使用Ack版本2.04。我想在文本文件中搜索像“jsonClass”:“Page”(包括引号)这样的文本 我似乎无法正确地引用和转义如何在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
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解决方案。)