次のように、ある文字セットを別のセットの対応する文字に置き換えたいと思います。
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
役に立ちます。