web-dev-qa-db-ja.com

OS Xでのsedによるインプレース編集

OS Xでsedを使用してファイルを編集したいのですが、次のコマンドを使用しています。

sed 's/oldword/newword/' file.txt

出力は端末に送信されます。 file.txtは変更されません。変更は、次のコマンドでfile2.txtに保存されます。

sed 's/oldword/newword/' file1.txt > file2.txt

ただし、別のファイルは必要ありません。 file1.txtを編集したいだけです。これどうやってするの?

-iフラグを試しました。これにより、次のエラーが発生します。

sed: 1: "file1.txt": invalid command code f
125
SundayMonday

-iフラグを使用するには、バックアップファイルに追加する接尾辞を指定します。例の拡張:

sed -i.bu 's/oldword/newword/' file1.txt

2つのファイルが提供されます。1つは置換を含むfile1.txtという名前で、もう1つは元のコンテンツを持つfile1.txt.buという名前です。

やや危険

元のファイルを破壊的に上書きする場合は、次のようなものを使用します。

sed -i '' 's/oldword/newword/' file1.txt
      ^ note the space

行の解析方法のため、引数の長さがゼロであるため、オプションフラグとその引数の間にスペースが必要です。

オリジナルを破棄する可能性があることを除いて、この方法でsedをtrickすさらなる危険性については知りません。ただし、sedのこの呼び出しがスクリプトの一部である場合、Unix Way™は(IMHO)sedを非破壊的に使用し、正常に終了したことをテストし、その後、無関係なファイルを削除してください。

243
whittle

私はMacOSで同様の問題を抱えています

sed -i '' 's/oldword/newword/' file1.txt

動作しませんが、

sed -i"any_symbol" 's/oldword/newword/' file1.txt

うまくいきます。

17
ksnt

既に提案されているように、sed-i''--in-place)を使用できます。 -iインプレース引数 を参照してください。ただし、-iオプションは非標準のFreeBSD拡張機能であり、他のオペレーティングシステムでは利用できない場合があります。第二に sedはaStreamEDitor、ファイルエディターではありません


別の方法は、Vim Exモードで次のような組み込みの置換を使用することです。

$ ex +%s/foo/bar/g -scwq file.txt

および複数ファイルの場合:

$ ex +'bufdo!%s/foo/bar/g' -scxa *.*

すべてのファイルを再帰的に編集するには、シェルがサポートしている場合は**/*.*を使用できます(shopt -s globstarで有効化)。


別の方法は、 gawk とその新しい "inplace"拡張 を使用することです。

$ gawk -i inplace '{ gsub(/foo/, "bar") }; { print }' file1
4
kenorb

次を使用できます。

sed -i -e 's/<string-to-find>/<string-to-replace>/' <your-file-path>

例:

sed -i -e 's/Hello/Bye/' file.txt

これはMacで問題なく動作します。

4
Vincent Lal
sed -i -- "s/https/http/g" file.txt
3
jazzed

これにより、バックアップファイルが作成されます。例えば。 sed -i -e 's/hello/hello world/' testfileは、同じディレクトリにバックアップファイルtestfile-eを作成します。

1
JustADude