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

问题描述 投票:3回答:2

我在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 ack
2个回答
4
投票

如果ack是一个函数,则可能发生-c由PowerShell解释。你能测试下面的吗?

ack '-c' '--match' '"jsonClass":"Page"'

-c --match应解释为--match是函数c中参数ask的值。

如果是EXE文件,请尝试:

ack -c --match '\"jsonClass\":\"Page\"'

5
投票

使用PowerShell v3 +解决方案补充JPBlanc's effective answer

当调用外部程序(如ack)时,使用所谓的停止解析符号--%,使得PowerShell通过原样传递剩余的参数,但扩展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视为单一论证,即使它包含空格。

© www.soinside.com 2019 - 2024. All rights reserved.