簡體   English   中英

如何在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。

要使用PowerShell v3+解決方案補充JPBlanc 的有效答案

調用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視為單個參數,即使它包含空格。

如果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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM