sedがハードリンクを破壊するのを防ぐ方法は?

sedがハードリンクを破壊するのを防ぐ方法は?

私の問題は次のようになりますsed -iがシンボリックリンクを破るのを防ぐ方法は?しかし、ハードリンクが含まれています。

sedを使用してファイルを処理すると、sed -iファイル内のすべてのハードリンクが削除されます。 sedは一時ファイルに書き込んでから移動する方法で動作するためです。この--follow-symlinksパラメータはハードリンクでは役に立ちません。

やや醜いアプローチを使用する以外に他のオプションはありますか?

sed 's/cat/dog/' pet_link > pet_link

ベストアンサー1

sed 's/cat/dog/'Bourneに似たシェルを使用してファイルサイズを変更しない代替の場合は、次のことができます。

sed 's/cat/dog/' < file 1<> file

35歳以上ほとんど知られていない人基準 <>オペレータは読み取り+書き込みモードでファイルを開きます。切り捨てなし。デフォルトでは、これはsed出力を入力に書き込みます。出力がsedまだ読み取っていないファイル部分を上書きしないようにすることが重要です。

ファイルサイズを小さくする交換の場合は、次のようにしますksh93

sed 's/hippopotamus/ant/' < file 1<>; file

<>;、リダイレクトされたコマンドが成功すると、コマンドが完了した時点でファイルが切り捨てられることを除いて、ksh93同じ拡張子です。<>

またはパールを使用してください:

perl -pe 's/hippopotamus/ant/;
          END{truncate STDOUT, tell STDOUT}' < file 1<> file

それ以外の場合は、標準形式を使用してください。

cp -i file file.back &&
  sed 's/dog/horse/g' < file.back > file # && rm -f file.back

1 BourneシェルとKornシェルの初期バージョンでは、元の実装が実際に破損していましたが、これは1980年代後半に修正されました。 Almquistシェルは最初はそれをサポートしません。

おすすめ記事