Sed

sed音譯中的轉義字元

  • November 22, 2021

我想使用sed’s transliterate ( y///) 將一組字元替換為另一組字元。

我希望這與使用該tr程序一樣有效。

$ echo '[]{}abc' | tr '[ab}' 'gefh' 
g]{hefc

但是,當我使用 sed 執行相同的操作時,我看到以下錯誤:

$ echo '[]{}abc' | sed 'y/[ab}/gefh/' 
sed: 1: "y/[ab}/gefh/": unbalanced brackets ([])

這是有道理的,因為我希望需要轉義[角色。但是,當我嘗試逃避它時,我收到以下不同的錯誤:

$ echo '[]{}abc' | sed 'y/\[ab}/gefh/' 
sed: 1: "y/\[ab}/gefh/": transform strings are not the same length

我目前的解決方法是(1)僅使用tr或(2)在音譯的右側插入一個“虛擬字元”,其工作是除了匹配轉義字元之外什麼都不做。

$ echo '[]{}abc' | sed 'y/\[ab}/_gefh/' 
g]{hefc

然而,這是不令人滿意和可疑的。它也不是很安全,例如當\在輸入字元串中時。

$ echo '[]{}abc\' | sed 'y/\[ab}/_gefh/' 
g]{hefc_

在不將轉義字元本身視為翻譯的一部分的情況下,在 sed 音譯中轉義字元的正確方法是什麼?

假設您在 macOS 上(sed我可以在其本機上顯示此問題的唯一系統,儘管我還沒有檢查過 macOSsed來自何處的 FreeBSD):

$ echo '[]{}abc' | sed 'y/[ab}/gefh/'
sed: 1: "y/[ab}/gefh/": unbalanced brackets ([])
$ echo '[]{}abc' | sed 'y/\[ab}/gefh/'
sed: 1: "y/\[ab}/gefh/": transform strings are not the same length
$ echo '[]{}abc' | sed 'y/\[ab}/\gefh/'
g]{hefc

因此,一種解決方案是

  1. 轉義[第一個字元串中的 以避免出現不平衡的括號,並且
  2. 通過向第二個字元串添加“no-op”反斜杠來使兩個字元串長度相等。

或者,

  • 您也可以將兩個字元串都包含在[...]中,經過反思,這可能是處理此問題的最安全方法,因為它可以以機械方式完成,而無需關心字元串中的[位置:
$ echo '[]{}abc' | sed 'y/[[ab}]/[gefh]/'
g]{hefc
  • sed或者通過例如 macOS 上的 Homebrew 或 FreeBSD 的軟體包系統安裝 GNU ,然後使用它。

我會將此視為此sed實現中的錯誤。

引用自:https://unix.stackexchange.com/questions/677817