我在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
我也尝试了文字选项,但我认为ack将冒号解释为文件参数。
ack -c -Q --match "jsonClass":"Page"
ack.pl: :Page: No such file or directory
我错过了什么?
我正在使用PowerShell v2。
如果ack
是一个函数,则可能发生-c
由PowerShell解释。你能测试下面的吗?
ack '-c' '--match' '"jsonClass":"Page"'
-c --match
应解释为--match
是函数c
中参数ask
的值。
如果是EXE文件,请尝试:
ack -c --match '\"jsonClass\":\"Page\"'
使用PowerShell v3 +解决方案补充JPBlanc's effective answer:
当调用外部程序(如ack
)时,使用所谓的停止解析符号--%
,使得PowerShell通过原样传递剩余的参数,但扩展cmd.exe
样式的环境变量引用(例如%PATH%
)除外:
ack --% -c --match "\"jsonClass\":\"Page\""
这使您可以专注于目标程序的转义规则,而无需担心与PowerShell自己的解析和转义的复杂相互作用。
因此,在PowerShell v3或更高版本中,OP自己的第二次解决方案尝试将通过传递--%
作为第一个参数。
请注意,不使用--%
(也适用于PSv2,并且如果要在其他参数中包含PowerShell扩展变量/表达式,通常有用),上述命令的完全等价物将如下所示:
ack -c --match '"\"jsonClass\":\"Page\""'
也就是说,将按原样传递的整个参数用单引号括起来,这可确保PowerShell不会解释它。
请注意JPBlanc答案中没有的内部封闭"
(截至本文撰写时)。他们保证论证最终被ack
视为单一论证,即使它包含空格。