[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Re: Configdateien aus script editieren (sed)



* Michelle Konzack schrieb am 28.Aug.2003:

> Versuche gerade Configdateien aus einem Script heraus zu editieren...
> Wenn es nur darum gehen würde, eine neue aus einer Template zu erstellen, 
> kein Problem...
> 
>     Debian=#irgendwas#
>     
>     sed "/#irgendwas#/$(NeuerWert)/" $(Configfile) > $(Configfile)

Nein, so auf keinen Fall, die Datei aus dem sed liest und in der
umgelenkt wird muß eine andere sein. Anschließend kann man die neue
Datei ja umbenennen.

Und bitte nicht auf Tricks wie

cat datei | sed .... | cat > datei 

hereinfallen. Die Pipes wirken wie Puffer. Bei kleinen Dateien
funktioniert das, nicht aber bei großen.

> Nur ist es so, das ich eine bereits vorhandene Configuration ändern will, 
> also zum Beispiel
> 
>     Debian=gut
> in
>     Debian=super
> 
> Wie kann ich das am besten machen ?

/^Debian=/s/gut/super/

Es werden nur Zeilen berücksichtigt, in denen Debian= am Anfang
steht.

Das Suchmuster vor dem s muß zwingend mit / begrenzt werden. Nach
dem s kann jedes beliebige Zeichen stehen etwa:

/^Debian=/s|gut|super|

oder wenn es unbedingt sein muß auch:

/^Debian=/sagutasupera

Du kannst auch einen Bereich eingeben, etwa:

/^Debian/,/^Ende/s/gut/super/g

hier wird jedes Aufkommen des Wortes gut zwischen der ersten Zeile,
die mit Debian anfängt und die darauf erste Zeile die mit dem Wort
Ende anfängt, durch das Wort super ersetzt. Einschließlich der
beiden begrenzenden Zeilen. Natürlich muß da nicht zwingend ein ^ am
Anfang stehen. Es kann da jedes beliebige RegExp stehen.

Eine andere Möglichkeit wäre:

3,14s/gut/super/g

hier wird jedes gut in den Zeilen 3 bis 14 einschließlich durch
super ersetzt. Auch Kombinationen gehen:

3,/^Ende/s/gut/super/g
/^Debian/,14s/gut/super/g

> Eigentlich sollte 'sed' mit dem Editieren ab dem '=' anfangen und 
> dann bis zum Zeilenende, nur dann gibt es auch wiederum probleme, 
> denn einige Zeilen haben Komentare dran kleben wie
> 
>     Debian=gut		# stimmts ?
> 
> die ich allerdings erhalten will. 

s/=gut\([ 	]*#.*\)\?$/=super\1/

Alles was zwischen \( und \) steht wird zu einer Gruppe
zusammengefaßt. Wegen des nachfolgenden \? kann es vorkommen, muß
aber nicht. Im Ersetzungsteil wird die durch \1 die erste Gruppe, so
wie sie ist hingeschrieben. \2 wäre die zweite Gruppe usw. Hierbei
zählt die öffnende Klammer. Es könnte ja auch verschachtelt sein.

Zwischen [ und ] steht hier ein Leerzeichen und ein Tab. Man könnte
auch [:blank:] nehmen, ist hier vielleicht sogar besser, da man dann
erkennt, was gemeint ist.

Bernd



Reply to: