我在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。
答案 0 :(得分:5)
使用 PowerShell v3 + 解决方案补充JPBlanc's effective answer:
当调用外部程序时,例如ack
使用所谓的停止解析符号--%
,使PowerShell 通过 as as is 传递剩余的参数,使用扩展cmd.exe
样式的环境变量引用的异常,例如%PATH%
:
ack --% -c --match "\"jsonClass\":\"Page\""
这个允许您专注于目标程序的转义规则,而不必担心与PowerShell自己的解析和转义的复杂相互作用。
因此,在PowerShell v3或更高版本中,OP自己的第二次解决方案尝试可以通过传递--%
作为第一个参数。
请注意,上述命令的完全等效而不使用--%
(在 PSv2 中也有效,如果你有帮助想要在其他参数中包含PowerShell扩展的变量/表达式)将如下所示:
ack -c --match '"\"jsonClass\":\"Page\""'
也就是说,按原样传递的整个参数包含在单引号中,这可确保PowerShell不会解释它。
请注意JPBlanc答案中不存在的内部封闭"
(截至撰写本文时)。它们保证ack
最终将参数视为单个参数,即使它包含空格。
答案 1 :(得分:4)
如果ack
是函数,则可能发生PowerShell解释-c
。你能测试下面的内容吗?
ack '-c' '--match' '"jsonClass":"Page"'
-c --match
应解释为--match
是函数c
中参数ask
的值。
如果它是EXE文件,请尝试:
ack -c --match '\"jsonClass\":\"Page\"'
答案 2 :(得分:1)
在 Powershell 中,您始终可以毫无问题地使用 '
引号来处理内部 "
。
但是如果您需要对字符串使用 "
(例如插入变量),您可以使用 `
$myvar = 'test'
$formatted = "{`"value`":`"$myvar`"}"
Write-Host $formatted
# output: {"value":"test"}