S sed
je to vlastně docela jednoduché :pokud se řádek shoduje, zkopírujte jej do h
starý prostor, pak s
nahradit hodnotu.
Na la$
t řádek ex
změňte přidržovací prostor a vzorový prostor a poté zkontrolujte, zda není prázdný. Pokud není prázdný, znamená to, že substituce již byla provedena, takže není co dělat. Pokud je prázdný, znamená to, že nebyla nalezena žádná shoda, proto nahraďte prostor vzoru požadovanou proměnnou=hodnota poté připojte k aktuálnímu řádku v zadržovací vyrovnávací paměti. Nakonec ex
znovu změnit:
sed '/^FOOBAR=/{h;s/=.*/=newvalue/};${x;/^$/{s//FOOBAR=newvalue/;H};x}' infile
Výše uvedené je gnu sed
syntax. Přenosné:
sed '/^FOOBAR=/{
h
s/=.*/=newvalue/
}
${
x
/^$/{
s//FOOBAR=newvalue/
H
}
x
}' infile
To se asi dá zkrátit. Není to jediný příkaz sed a také používá grep, ale zdá se, že je to v podstatě to, co chcete. Je to jeden řádek a upravuje soubor na místě (žádné dočasné soubory).
grep -q "^FOOBAR=" file && sed "s/^FOOBAR=.*/FOOBAR=newvalue/" -i file ||
sed "$ a\FOOBAR=newvalue" -i file
Zde je jednodušší sed
přístup, protože nenacházím sed
hold space
snadné pracovat. Pokud vám vyhovuje hold space
, použití přístupu don_crissti poskytuje další příležitost zachovat cokoli ze stávající linie, ale to je obvykle velmi vzácné.
V tomto přístupu pouze vytisknete všechny řádky kromě řádku, který chcete vypustit, a na konci připojíte náhradu.
sed -n -e '/^FOOBAR=/!p' -e '$aFOOBAR=newvalue' infile