Mehrere Zeilen mittels sed überschreiben

FragenMehrere Zeilen mittels sed überschreiben
Fabian Lesniak - Samstag, 12. September 2009 18:53 Uhr

Hallo zusammen!
Ich versuche seit einer Weile, in einer Textdatei verschiedene Zeilen mittels einem sed-Einzeiler zu verändern:

Der Original-Text sieht ungefähr so aus:

stat {
entry {
type = normal;
name = one;
statistic {
rs = cnrg;
tr {
s = 0;
}
yf {
s = 0;
}
tx {
s = 0;
}
tw {
s = 0;
}
km {
s = 0;
}
cm {
s = 0;
}
tt {
s = 0;
}
ut = 0w;
} {
type = normal;
name = two;
statistic {
rs = cnrg;
tr {
s = 5216;
}
yf {
s = 3424;
}
tx {
s = 1102;
}
tw {
s = 78054;
}
km {
s = 4400;
}
cm {
s = 190;
}
tt {
s = 11238;
}
ut = 120405023w;
}
}

Man sieht, dass beim ersten Eintrag jedes Mal s=0 gesetzt wird, beim zweiten sind es jedoch ziemlich wirre Werte. Jetzt möchte ich per sed alle s=… durch s=0 ersetzen, ohne dass weitere Einträge (z.b. name=three usw.) verändert werden, also nur die paar Zeilen unter name=two.
Ich habe schon versucht, die Zeile per
A=$(grep -n „two“ | awk -v FS=“:“ ‚{print $1}‘)
die Zeilennummer von name=two herauszufinden und dann mit:
sed -e ‚$[$A+4]d;$[$A+5]\ s = 0 ;
die erste Zeile zu ersetzen, aber das geht doch auch sicher noch einfacher, gleich für alle Zeilen und am besten ohne awk. Ich bin für jeden Tipp dankbar!

1 Antwort
Roland M. Egloff - Samstag, 12. September 2009 21:10 Uhr

Hallo Fabian,

Folgendes sollte funktionieren:

sed -i ’s/$s\ *=\ *[0-9][0-9]*;/s=0;/‘ filename.txt

Bemerkungen:

sed -i ’s/von/nach/g‘ filename.txt

„-i“ = input file wird editiert (!!! also vorher ein Backup machen !!!)

„$“ = Anfang einer Zeile

„\ *“ = 0 oder mehrere Lehrzeichen (\ space *)

„[0-9][0-9]*“ = mindestens eine Zahl

Gruss

Roland

Roland M. Egloff - Samstag, 12. September 2009 21:14 Uhr

Hallo Fabian,

!!!Korrektur!!!

sed -i ’s/^s\ *=\ *[0-9][0-9]*;/s=0;/‘ filename.txt

„^“ = Anfang einer Zeile

(„$“ = Ende einer Zeile)

Gruss

Roland

Fabian Lesniak - Samstag, 12. September 2009 22:10 Uhr

Vielen Dank Roland!
Es hat fast funktioniert, weil das CMS hier die Leerzeichen vor s=… „weggeschnitten“ hat. Du hast mir aber sehr geholfen und ich konnte das hier basteln:
sed -i ’s/^\ *s\ *=\ *[0-9][0-9]*;/s=0;/‘ filename.txt
Das hat dann auch wunderbar funktioniert.

Gruß
Fabian

Deine Antwort