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

时间:2016-10-15 11:20:43

标签: powershell ack

我在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。

3 个答案:

答案 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自己的第二次解决方案尝试可以通过传递--%作为第一个参数。

请参阅Get-Help about_Parsing

请注意,上述命令的完全等效而不使用--%(在 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"}