sed - alle strings zwischen 2 andere strings ersetzen
sed - alle strings zwischen 2 andere strings ersetzen
hallo
angenommen ich hab die datei data.txt:
bar start bar end bar
und will alle "bar"'s zwischen start und end mit foo ersetzen, wie wuerde das sed script dazu aussehen?
ich hab's mit
sed -e '/start/,/end/{s/bar/foo/g;}'
versucht, allerdings wurden dann jeweils saemtliche bars mit foo ersetzt
weiss vielleicht einer wie ich's richtig anstelle? =)
danke im voraus,
gruesse
stdio
angenommen ich hab die datei data.txt:
bar start bar end bar
und will alle "bar"'s zwischen start und end mit foo ersetzen, wie wuerde das sed script dazu aussehen?
ich hab's mit
sed -e '/start/,/end/{s/bar/foo/g;}'
versucht, allerdings wurden dann jeweils saemtliche bars mit foo ersetzt
weiss vielleicht einer wie ich's richtig anstelle? =)
danke im voraus,
gruesse
stdio
- godsmacker
- Beiträge: 902
- Registriert: 16.03.2003 21:50:26
- Lizenz eigener Beiträge: Artistic Lizenz
- Wohnort: Chemnitz
-
Kontaktdaten:
- SubOptimal
- Beiträge: 1709
- Registriert: 10.01.2005 23:25:46
- Lizenz eigener Beiträge: GNU Free Documentation License
- Wohnort: bei Frankfurt
Hi stdio,
z.B. so:
SubOptimal
z.B. so:
Code: Alles auswählen
sed -n 's/\(^.*start\).*\(end.*\)/\1 foo \2/p' data.txt
higodsmacker hat geschrieben:Ich würdeverwenden.Code: Alles auswählen
perl -pi -e 's/foo/bar/ if (/start/ .. /end/)' file
-Flo
danke fuer die rasche antwort!
leider hatte ich nie viel mit perl zu tun, deshalb habe ich einfach mal alles copied & pasted
ergebnis:
es wurde jeweils der erste eintrag von bar in einer zeile ersetzt
- godsmacker
- Beiträge: 902
- Registriert: 16.03.2003 21:50:26
- Lizenz eigener Beiträge: Artistic Lizenz
- Wohnort: Chemnitz
-
Kontaktdaten:
Hoppla.
-Flo
Code: Alles auswählen
perl -pi -e 's/foo/bar/g if (/start/ .. /end/)'
- Savar
- Beiträge: 7174
- Registriert: 30.07.2004 09:28:58
- Lizenz eigener Beiträge: MIT Lizenz
- Wohnort: Berlin
Code: Alles auswählen
sed 's/start bar/start foo/' data.txt
funktioniert gut, das problem hierbei ist allerdings, dass auch alle anderen daten zwischen start und end verloren gehenSubOptimal hat geschrieben:Hi stdio,
z.B. so:SubOptimalCode: Alles auswählen
sed -n 's/\(^.*start\).*\(end.*\)/\1 foo \2/p' data.txt
funktioniert perfekt, danke! =)godsmacker hat geschrieben:Hoppla.-FloCode: Alles auswählen
perl -pi -e 's/foo/bar/g if (/start/ .. /end/)'
hm, funktioniert doch nichtgodsmacker hat geschrieben:Hoppla.-FloCode: Alles auswählen
perl -pi -e 's/foo/bar/g if (/start/ .. /end/)'
auch hier werden wieder jeweils alle eintraege ersetzt, nicht nur die zwischen start und end
das 2. start muss wohl end sein? ging auch nicht :/Savar hat geschrieben:Code: Alles auswählen
sed 's/start bar/start foo/' data.txt
- godsmacker
- Beiträge: 902
- Registriert: 16.03.2003 21:50:26
- Lizenz eigener Beiträge: Artistic Lizenz
- Wohnort: Chemnitz
-
Kontaktdaten:
test.data:stdio hat geschrieben:hm, funktioniert doch nichtgodsmacker hat geschrieben:Hoppla.-FloCode: Alles auswählen
perl -pi -e 's/foo/bar/g if (/start/ .. /end/)'
auch hier werden wieder jeweils alle eintraege ersetzt, nicht nur die zwischen start und end
Code: Alles auswählen
foo bar
start
foo bar
end
foo bar
Code: Alles auswählen
perl -pi -e 's/foo/bar/g if (/start/ .. /end/)' < test.data
foo bar
start
bar bar
end
foo bar
die eintraege sind auf einer zeile, deshalb funktioniert godsmackers loesung leider nicht
beim file handelt es sich um ein xml file dessen aufbau etwa so aussieht:
<document>
<entry><id>1</id><foo>123456789</foo><dontchange>123456789</dontchange></entry>
<entry><id>1</id><foo>987654321</foo><dontchange>987654321</dontchange></entry>
</document>
ich versuche also den inhalt von foo zu veraendern ohne den inhalt von dontchange oder id auch zu veraendern
ich dachte ich haette es so loesen konnen:
war aber nicht so :/
egal ob y/*/*/ oder s/*/*/g, er aenderte jeweils die treffer der ganzen zeile
beim file handelt es sich um ein xml file dessen aufbau etwa so aussieht:
<document>
<entry><id>1</id><foo>123456789</foo><dontchange>123456789</dontchange></entry>
<entry><id>1</id><foo>987654321</foo><dontchange>987654321</dontchange></entry>
</document>
ich versuche also den inhalt von foo zu veraendern ohne den inhalt von dontchange oder id auch zu veraendern
ich dachte ich haette es so loesen konnen:
Code: Alles auswählen
sed -e '/foo/,/\/foo/{y/0123456789/9876543210/;}'
egal ob y/*/*/ oder s/*/*/g, er aenderte jeweils die treffer der ganzen zeile
- godsmacker
- Beiträge: 902
- Registriert: 16.03.2003 21:50:26
- Lizenz eigener Beiträge: Artistic Lizenz
- Wohnort: Chemnitz
-
Kontaktdaten:
die tags sind jeweils unterschiedlich, kein tag kommt mehrmals in einer zeile vor
der inhalt jedoch kann mehrere male in verschiedenen tags aufkommen
ich wuerde gerne eine loesung als bourne-shell skript haben, da ich diesen
vorgang automatisieren will
edit: das was ich oben gepostet habe, ist sozusagen aus dem original xml file kopiert, lediglich die tag namen wurden veraendert
der inhalt jedoch kann mehrere male in verschiedenen tags aufkommen
ich wuerde gerne eine loesung als bourne-shell skript haben, da ich diesen
vorgang automatisieren will
edit: das was ich oben gepostet habe, ist sozusagen aus dem original xml file kopiert, lediglich die tag namen wurden veraendert
- Savar
- Beiträge: 7174
- Registriert: 30.07.2004 09:28:58
- Lizenz eigener Beiträge: MIT Lizenz
- Wohnort: Berlin
na das sollte doch so gehen wie schonmal beschrieben?!
Code: Alles auswählen
sed -e 's/<foo>123456789</foo>/<foo></foo>/' DATEID.xml