Sed
sed音譯中的轉義字元
我想使用
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
因此,一種解決方案是
- 轉義
[
第一個字元串中的 以避免出現不平衡的括號,並且- 通過向第二個字元串添加“no-op”反斜杠來使兩個字元串長度相等。
或者,
- 您也可以將兩個字元串都包含在
[...]
中,經過反思,這可能是處理此問題的最安全方法,因為它可以以機械方式完成,而無需關心字元串中的[
位置:$ echo '[]{}abc' | sed 'y/[[ab}]/[gefh]/' g]{hefc
sed
或者通過例如 macOS 上的 Homebrew 或 FreeBSD 的軟體包系統安裝 GNU ,然後使用它。我會將此視為此
sed
實現中的錯誤。