如何在 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 自己的第二次解决方案尝试通过将 --%
作为第一个参数传递来实现。
请注意 exact 等同于上述命令而不使用 --%
(这在 PSv2 和通常有用如果你想在其他参数中包含 PowerShell 扩展变量/表达式) 看起来像这样:
ack -c --match '"\"jsonClass\":\"Page\""'
也就是说,要按原样传递的整个参数包含在单引号中,这确保 PowerShell 不会解读一下。
请注意 JPBlanc 的答案(截至撰写本文时)中不存在的内部封闭 "
。他们保证该参数最终被 ack
视为 单个 参数,即使它包含空格。
在 Powershell 中,您始终可以使用 '
引号来毫无问题地处理内部 "
。
但是如果你需要对一个字符串使用"
(例如插入一个变量),你可以用`
转义它们
$myvar = 'test'
$formatted = "{`"value`":`"$myvar`"}"
Write-Host $formatted
# output: {"value":"test"}
我在 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 自己的第二次解决方案尝试通过将 --%
作为第一个参数传递来实现。
请注意 exact 等同于上述命令而不使用 --%
(这在 PSv2 和通常有用如果你想在其他参数中包含 PowerShell 扩展变量/表达式) 看起来像这样:
ack -c --match '"\"jsonClass\":\"Page\""'
也就是说,要按原样传递的整个参数包含在单引号中,这确保 PowerShell 不会解读一下。
请注意 JPBlanc 的答案(截至撰写本文时)中不存在的内部封闭 "
。他们保证该参数最终被 ack
视为 单个 参数,即使它包含空格。
在 Powershell 中,您始终可以使用 '
引号来毫无问题地处理内部 "
。
但是如果你需要对一个字符串使用"
(例如插入一个变量),你可以用`
$myvar = 'test'
$formatted = "{`"value`":`"$myvar`"}"
Write-Host $formatted
# output: {"value":"test"}