[英]How to escape double quotes and colon in ACK in PowerShell
我在 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。
要使用PowerShell v3+解决方案补充JPBlanc 的有效答案:
在调用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
是一个函数,那么-c
可能会被 PowerShell 解释。 您可以测试以下内容吗?
ack '-c' '--match' '"jsonClass":"Page"'
-c --match
应该被解释为--match
是函数ask
中参数c
的值。
如果是 EXE 文件,请尝试:
ack -c --match '\"jsonClass\":\"Page\"'
在 Powershell 中,您始终可以使用'
quote 来处理内部"
没有问题。
但是,如果您需要将"
用于字符串(例如插入变量),您可以使用 ` 转义它们
$myvar = 'test'
$formatted = "{`"value`":`"$myvar`"}"
Write-Host $formatted
# output: {"value":"test"}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.