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
-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
を非破壊的に使用し、正常に終了したことをテストし、その後、無関係なファイルを削除してください。
私はMacOSで同様の問題を抱えています
sed -i '' 's/oldword/newword/' file1.txt
動作しませんが、
sed -i"any_symbol" 's/oldword/newword/' file1.txt
うまくいきます。
既に提案されているように、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
次を使用できます。
sed -i -e 's/<string-to-find>/<string-to-replace>/' <your-file-path>
例:
sed -i -e 's/Hello/Bye/' file.txt
これはMacで問題なく動作します。
sed -i -- "s/https/http/g" file.txt
これにより、バックアップファイルが作成されます。例えば。 sed -i -e 's/hello/hello world/' testfile
は、同じディレクトリにバックアップファイルtestfile-eを作成します。