ファイルのグループ所有権を変更する内部編集機能を備えたSed

ファイルのグループ所有権を変更する内部編集機能を備えたSed

phpこの方法でターゲットファイルに接続するシェル()スクリプトがあります。

  • ファイルとディレクトリが書き込み可能であることを確認してくださいphpis_writable()これは問題ではないようです)。
  • 内部ファイル編集コマンドを使用してくださいsed

grep -q "$search" "$passwd_file" && { sed -i "s|$search|$replace|" "$passwd_file"; printf "Password changed!\n"; } || printf "Password not changed!\n"

その結果、私は(他のすべては正しいですがmyuser:www-datamyuser:myuser

ファイルグループの所有権が変更されますかsed?可能であれば、これを防ぐ方法は何ですか?

ベストアンサー1

sed内部編集モードに小さな問題があります-i。内部にランダムに生成された文字列を含むsed同じディレクトリに名前が付けられた一時ファイルを作成します。このファイルは元のファイルの変更内容で埋められます。操作が完了したら、元のファイルを削除し、一時ファイル名を元のファイル名に変更します。だからそれは本当ではありません。sedy08qMAy08qMAsed所定の位置で編集。呼び出すユーザーの権限と新しい inode 番号を使用して新しいファイルを生成します。この動作は主に良いですが、たとえばハードリンクが壊れています。

しかし、望むなら本物内部編集には使用する必要がありますed。一時ファイルなしで標準入力からコマンドを読み取り、ファイルを直接編集します(edメモリバッファで実行されます)。一般的な方法は、printfビルドコマンドのリストを使用することです。

printf "%s\n" '1,$s/search/replace/g' wq | ed -s file

このprintfコマンドは、次の出力を生成します。

1,$s/search/replace/g
wq

これらの2行はedコマンドです。最初の検索文字列をsearchに置き換えますreplace。 2番目はw変更をファイルに書き込み()終了します(q)。-s診断出力を抑制します。

おすすめ記事