sed
を使用すると、実際には非常に簡単です :行が一致する場合は、それを h
にコピーするだけです 古いスペースの場合 s
値を代入します。
La$
で t 行 ex
ホールド スペースとパターン スペースを変更し、後者が空かどうかを確認します。空でない場合は、置換がすでに行われているため何もしないことを意味します。空の場合は、一致が見つからなかったことを意味するため、パターン スペースを目的の variable=value に置き換えます 次に、ホールド バッファーの現在の行に追加します。最後に、ex
もう一度変更:
sed '/^FOOBAR=/{h;s/=.*/=newvalue/};${x;/^$/{s//FOOBAR=newvalue/;H};x}' infile
上記は gnu sed
です 構文。ポータブル:
sed '/^FOOBAR=/{
h
s/=.*/=newvalue/
}
${
x
/^$/{
s//FOOBAR=newvalue/
H
}
x
}' infile
これはおそらく短縮できます。これは単一の sed コマンドではなく、grep も使用しますが、これは基本的にあなたが望んでいるもののようです。これは 1 行で、ファイルをその場で編集します (一時ファイルはありません)。
grep -q "^FOOBAR=" file && sed "s/^FOOBAR=.*/FOOBAR=newvalue/" -i file ||
sed "$ a\FOOBAR=newvalue" -i file
これはより単純な sed
です sed
が見つからないので、アプローチします hold space
扱いやすい。 hold space
に慣れている場合 、don_crissti アプローチを使用すると、既存の行から何かを保持する追加の機会が得られますが、これは通常非常にまれです。
このアプローチでは、ドロップしたい行を除いてすべてを印刷し、最後に置換を追加します。
sed -n -e '/^FOOBAR=/!p' -e '$aFOOBAR=newvalue' infile