"tr"などの文字を翻訳するために "sed"を使用できますか?

"tr"などの文字を翻訳するために "sed"を使用できますか?

次のように、ある文字セットを別のセットの対応する文字に置き換えたいと思います。

original set: ots
"target" set: u.x

foobartest → fuubar.ex.

このような翻訳/翻訳はこのコマンドの特徴ですtr

$ echo 'foobartest' | tr 'ots' 'u.x'
fuubar.ex.

残念ながら、trその場でファイルを変更することはサポートされていませんsed。一時ファイルホイールを再作成する必要がないようにこれを
使用したいと思います。sed

答え1

sedほとんどの実装でyは、少なくともうまく機能するコマンドを使用すると、次のようになります。tr

$ echo 'foobartest' | sed 'y/ots/u.x/'
fuubar.ex.

このyコマンドはPOSIXsed仕様したがって、すべてのプラットフォームで実行する必要があります。

そのため、sedファイルを編集されたバージョンに置き換えることができ、面倒な一時ファイルビジネスを節約できます(実装がPOSIXで指定しない対応するsedオプションをサポートしている場合)。-i

$ sed -i 'y/ots/u.x/' some-file.txt

現在のBSDの実装sed tr一部の特殊なケースでは、実際に動作を反映していません。

答え2

あなたの場合のようにサイズを変更せずに文字を翻訳する場合(GNUなどのいくつかの実装はtrとにかくシングルバイト文字のみをサポートします)、次のことができます。

tr 'ots' 'u.x' < file 1<> file

つまり、trファイル自体を上書きすることです。

sed -i複数のアカウントよりも優れています。

  • 追加のディスク容量は必要ありません(一部のまれなファイル、書き込み時のコピー特殊ケースを除く)。
  • inode番号、所有権、権限、ACLなどを保持します。
  • シンボリックリンクとうまく機能し、ハードリンクは壊れません。
  • 終了時に一時ファイルを残しません。

1つの欠点は、中断するとファイルが半分だけ翻訳されることです。ただし、この場合はもう一度実行して完了できます。一部のsed実装では、コマンドが成功しない限り、ソースファイルが変更されていないままになるようにすることで、適切に処理できます。

答え3

あるいは、主な問題が内部でファイルの変更をサポートしていない場合は、次の点spongeに興味があるかもしれません。その他のユーティリティパッケージ:

tr 'ots' 'u.x' < file | sponge file

書きますが、入力が完了した後にのみ書き込みfile用に開きます。file~からマンページ:

sponge標準入力を読み取り、指定されたファイルに書き込みます。シェルリダイレクトとは異なり、スポンジは出力ファイルを開く前にすべての入力を吸収します。これにより、同じファイルを読み書きするパイプラインを構築できます。

メモリに収まらない非常に大きなファイルがない場合は、この方法がsponge役に立ちます。

関連情報