[英]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。
要使用PowerShell v3+解決方案補充JPBlanc 的有效答案:
在調用ack
等外部程序時,使用所謂的停止解析符號--%
使 PowerShell按原樣傳遞剩余參數,但擴展cmd.exe
風格的環境變量引用除外,例如%PATH%
:
ack --% -c --match "\"jsonClass\":\"Page\""
這使您可以只關注目標程序的轉義規則,而不必擔心與 PowerShell 自己的解析和轉義的復雜相互作用。
因此,在 PowerShell v3 或更高版本中,OP 自己的第二個解決方案嘗試將通過傳遞--%
作為第一個參數來工作。
請注意,不使用--%
的上述命令的完全等效項(這也適用於PSv2 ,如果您想在其他參數中包含 PowerShell 擴展變量/表達式,通常會很有幫助)如下所示:
ack -c --match '"\"jsonClass\":\"Page\""'
也就是說,要按原樣傳遞的整個參數用單引號括起來,以確保 PowerShell 不會對其進行解釋。
請注意 JPBlanc 的答案中不存在的內部封閉"
(在撰寫本文時)。它們保證該參數最終被ack
視為單個參數,即使它包含空格。
如果ack
是一個函數,那么-c
可能會被 PowerShell 解釋。 您可以測試以下內容嗎?
ack '-c' '--match' '"jsonClass":"Page"'
-c --match
應該被解釋為--match
是函數ask
中參數c
的值。
如果是 EXE 文件,請嘗試:
ack -c --match '\"jsonClass\":\"Page\"'
在 Powershell 中,您始終可以使用'
quote 來處理內部"
沒有問題。
但是,如果您需要將"
用於字符串(例如插入變量),您可以使用 ` 轉義它們
$myvar = 'test'
$formatted = "{`"value`":`"$myvar`"}"
Write-Host $formatted
# output: {"value":"test"}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.