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


142

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

2
-iフラグを試すときに使用している正確なコマンドは何ですか?
eldarerathis、2011

回答:


281

-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をだましてそれ以上の危険を認識していません。ただし、このの呼び出しがsedスクリプトの一部である場合、Unix Way™は(IMHO)sed非破壊的に使用し、正常に終了したことをテストしてから、不要なファイルを削除することに注意してください。


私は-iフラグの後の拡張子を省略していましたね。ある-i''潜在的に元のファイルをめちゃくちゃに(そしてバック・アップを持っていない)以外の理由で危険な?
2011

sedmanページによると、デバイスのディスク領域が不足すると、ストライドの途中でファイルが破損し、出力結果が悪くなる可能性があります。sed -i ""バックアップなしのローカルソース管理下で作業している場合は、ほとんどの場合(またはgit init && git add -A . && git commit -m 'backup'sedを-iモードで実行する直前)に問題ありません。
cfeduke、2014年

2
少し危険なビットが特に便利だと思いました。+1
Andre

5
BSD sedでは、-iフラグの後にスペースを入れないでください。したがって、-i''有効ですが無効です-i ''
トッドA.ジェイコブス

3
ああ!BSD sedは '\ n'文字を無視し、代わりに 'n'を出力します!私のMacではBSD sedをGNU sedに置き換えるだけです!
nterry 2016年

20

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

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

動作しませんが、

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

うまくいきます。


これは今では逆です。sed -i '' <file>機能するが機能しsed -i'' <file>なくなる
Zohaib Amanzai


4

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


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

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

複数ファイルの場合:

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

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


別の方法は使用することです gawkな新しい「インプレース」拡張です。

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

4

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


Mac OS Catalinaでも同じです。-iと-eの両方を別々に渡す(一緒にしない-!)と、「-e」が付加されたバックアップファイルが作成されます。
Daniel Kesner

1

以下を使用できます。

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

例:

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

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


2
これにより、Mac OS Catalinaで「-e」が追加されたバックアップファイルが作成されます。
Daniel Kesner

これはmacOSには間違っています。そこの「man sed」ページをご覧ください。-imacOSの引数が必要です。1つ指定しないので、が使用さ-eれ、2番目のファイルが-e追加されます。-emacOSには存在しません-E。したがって、macOSの正しいコマンドはsed -i '' -E 's/Hello/Bye/' file.txt
Marc J. Schmidt
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.