私の問題は次のようになります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シェルは最初はそれをサポートしません。