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!
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
Hallo Fabian,
!!!Korrektur!!!
sed -i ‘s/^s\ *=\ *[0-9][0-9]*;/s=0;/’ filename.txt
“^” = Anfang einer Zeile
(“$” = Ende einer Zeile)
Gruss
Roland
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