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

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。

如果 ack 是一个函数,则 -c 可能会被 PowerShell 解释。你能测试以下吗?

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

-c --match应该解释为--match是函数ask.

中参数c的值

如果是EXE文件,试试:

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

PowerShell v3+ 解决方案补充

调用外部程序时,例如ack ,使用所谓的 停止解析符号 --%,使 PowerShell 按原样 传递剩余参数 例外 扩展 cmd.exe 风格的环境变量引用,例如 %PATH%:

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

允许您只关注目标程序的转义规则,而不用担心与 PowerShell 自身解析和转义的复杂相互作用。

因此,在 PowerShell v3 或更高版本中,OP 自己的第二次解决方案尝试通过将 --% 作为第一个参数传递来实现。

Get-Help about_Parsing


请注意 exact 等同于上述命令而不使用 --%(这在 PSv2 和通常有用如果你想在其他参数中包含 PowerShell 扩展变量/表达式) 看起来像这样:

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

也就是说,要按原样传递的整个参数包含在引号中,这确保 PowerShell 不会解读一下。

请注意 JPBlanc 的答案(截至撰写本文时)中不存在的内部封闭 "。他们保证该参数最终被 ack 视为 单个 参数,即使它包含空格。

在 Powershell 中,您始终可以使用 ' 引号来毫无问题地处理内部 "

但是如果你需要对一个字符串使用"(例如插入一个变量),你可以用`

转义它们
$myvar = 'test'
$formatted = "{`"value`":`"$myvar`"}"

Write-Host $formatted
# output: {"value":"test"}