ファイルに永続的な変更を加えるsedコマンドを取得するにはどうすればよいですか?


32

これは可能ですか?私はどこかで次のコマンドがそれをするだろうと読んだ:

sed -e [コマンド] [ファイル]

しかし、それはちょうどと同じことをするように見えた

sed [コマンド] [ファイル]

(変更を保存しませんでした)。sedを使用してこれを行う方法はありますか?


2
-eフラグは、発現のための略です。あなたはおそらくしたい-iどの手段旗をin-place、私は強くあなたが使用することをお勧めします sed -i.bak 's/../' filename
バレンティンBajrami

回答:


50

あなたが探していると思う-i

   -i[SUFFIX], --in-place[=SUFFIX]

          edit files in place (makes backup if SUFFIX supplied)

例えば:

$ cat foo.txt
hello world
$ sed -i 's/o/X/g' foo.txt
$ cat foo.txt
hellX wXrld

サフィックスを指定すると、バックアップファイルが作成されます。

$ ls
foo.txt
$ sed -i.bak 's/o/X/g' foo.txt 
$ ls
foo.txt  foo.txt.bak

入力ファイルが変更され、元のファイルデータを含むバックアップが作成されます。

また、これはGNUのためであることに注意sedがあり、わずかな差異異なる間の形式でsed実装が。


4
マニュアルページが間違っていることに注意してください。sedインプレース編集は行いません。新しいファイルが作成され、古いファイルが上書きされ、iノードが変更されます。
マルコ

2
@Marcoこれは、ファイルを適切に編集する安全な方法です。sedドキュメンテーションの「インプレースでファイルを編集する」とは、元のファイル(名前で定義)が変更されることを意味し、元のファイル(iノードで定義)が変更されることではありません。
ジル 'SO-悪であるのをやめる'

2
@Gillesこれはファイルを編集するための好ましい方法であることに完全に同意しますが、その場でそれ呼び出すことほとんどありません。しかし、それは、ファイルがどのように識別されるか、iノードまたは名前によって問題になります。iノードで言うと、そうでない場合{ rm file; cmd > file; } < file、cmdは同じファイルを読み書きするという結論に至りますが、そうではありません。偶然同じ名前を持つ2つのdistinceファイルです。しかし、ここで議論を始めたくありません。
マルコ

macOS 10.14ではsed: 1: "foo.txt": invalid command code f、実行時に取得しますsed -i 's/o/X/g' foo.txt。ただし、拡張機能を提供することはsed -i .bak 's/o/X/g' foo.txtうまく機能します。バックアップファイルを作成せずに機能させる方法はありますか?
ジョシュアピンター

1
さて、それを理解しました。MacOSのでは、明示的拡張のparamオプションに空の文字列を追加する必要がありますsed -i '' 's/o/X/g' foo.txt
ジョシュアピンター


1

-eオプションは複数のsedコマンドを実行するためのものです

sed -e 's/linux/unix/' -e 's/os/OS/' file.txt

検討しfile.txt

linux os

O / Pは

unix os

-i オプションは変更を永久に保存します...

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.