sed 音訳のエスケープ文字

sed 音訳のエスケープ文字

sed音域(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の翻訳で文字をエスケープする正しい方法は何ですか?

ベストアンサー1

sedmacOSを使用しているとします(macOS用FreeBSDがどこから来たのかを確認していませんが、この問題をデフォルトで表示できる唯一のシステムです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
$ echo '[]{}abc' | sed 'y/\[ab}/\gefh/'
g]{hefc

だから、一つ解決策は

  1. [不均衡な括弧を避けるために、最初の文字列をエスケープします。
  2. 2番目の文字列に「no-op」バックスラッシュを追加して、2つの文字列の長さを等しくします。

または、

  • 両方の文字列を囲むこともできます[...]。これは、文字列のどこにあるか気にせずに機械的に実行できるため、これを処理する最も安全な方法です[

    $ echo '[]{}abc' | sed 'y/[[ab}]/[gefh]/'
    g]{hefc
    
  • sedまたは、macOSにHomebrewまたはFreeBSDのパッケージシステムを介してGNUをインストールして使用してください。

sed私はこれをこの実装のバグだと思います。

おすすめ記事