sed, zeile teilweise wegschneiden.

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
Benutzeravatar
Voyager_MP
Beiträge: 628
Registriert: 22.06.2004 10:04:07
Wohnort: Aachen

sed, zeile teilweise wegschneiden.

Beitrag von Voyager_MP » 31.01.2013 12:30:29

Hi, ich muss alles zwischen <Absender></Absender> rausschneiden.

Code: Alles auswählen

bla aaa aa a a <Absender>WIESBADEN</Absender><Personen><Person version="1.0" person-key="BRG8XN5UVK"><Personendaten eigenschaften="P
Mein Code klappt leider nicht

Code: Alles auswählen

cat 2013-01-30_23-45-28_AMPEL-234234_40904.rep | while read line; do echo -e "\n$line\n" | sed -n '/<Absender>/,/</Absender>/p' ; done
Gruß Michel

Benutzeravatar
Meillo
Moderator
Beiträge: 9261
Registriert: 21.06.2005 14:55:06
Wohnort: Balmora
Kontaktdaten:

Re: sed, zeile teilweise wegschneiden.

Beitrag von Meillo » 31.01.2013 12:45:22

Wenn du innerhalb eine Zeile arbeiten willst, dann ist das `s'-Kommando passend. Wenn du nur in bestimmten Zeilen arbeiten willst, dann kannst du das mit Ranges machen wie du es in deinem Beispiel getan hast.

Vermutlich suchst du sowas in der Art von:

Code: Alles auswählen

sed 's,<Absender>.*</Absender>,<Absender></Absender>,'

btw: Mit dem `echo'-Befehl fuegst du doch Leerzeilen zwischen die einzelnen Zeilen ein. Das ginge (nicht exakt gleich aber dafuer einfacher) auch mit awk:

Code: Alles auswählen

awk '{print; print ""}'
Als Vorschlag haette ich demnach soetwas wie:

Code: Alles auswählen

<2013-01-30_23-45-28_AMPEL-234234_40904.rep sed 's,<Absender>.*</Absender>,<Absender></Absender>,'  | awk '{print; print ""}'
Use ed once in a while!

Cae
Beiträge: 6349
Registriert: 17.07.2011 23:36:39
Wohnort: 2130706433

Re: sed, zeile teilweise wegschneiden.

Beitrag von Cae » 31.01.2013 12:47:06

Code: Alles auswählen

$ sed 's/\(^.*<Absender>\)\(.*\)\(<\/Absender>.*$\)/\2/' /tmp/2013-01-30_23-45-28_AMPEL-234234_40904.rep
WIESBADEN
MAINZ
$ 
Im Prinzip sucht man sich den Zeilenanfang bis zum Anfangspattern (\1), den Endpattern bis zum Zeilenende (\3) und alles dazwischen (\2) als einzelne Ausdruecke der Form \(foo\), und ersetzt die komplette Zeile mit dem mittleren. Ich find's unsauber, aber es funktioniert.

Das cat, das read und echo kannst du dir uebrigens sparen. Einfach sed mit dem Dateinamen als Argument aufrufen, so wie oben. Oder per Eingabeumlenkung/ Wenn es die Newline unbedingt braucht, kann man sie im replace-String unterbringen.

Gruss Cae
If universal surveillance were the answer, lots of us would have moved to the former East Germany. If surveillance cameras were the answer, camera-happy London, with something like 500,000 of them at a cost of $700 million, would be the safest city on the planet.

—Bruce Schneier

Benutzeravatar
Voyager_MP
Beiträge: 628
Registriert: 22.06.2004 10:04:07
Wohnort: Aachen

Re: sed, zeile teilweise wegschneiden.

Beitrag von Voyager_MP » 31.01.2013 12:49:56

Hi, danke, aber ich glaube ich habe mich falsch ausgedrueckt, ich brauche die zeile ohne den <Absender>bla</Absender> tag
Gruß Michel

Cae
Beiträge: 6349
Registriert: 17.07.2011 23:36:39
Wohnort: 2130706433

Re: sed, zeile teilweise wegschneiden.

Beitrag von Cae » 31.01.2013 12:52:23

Ist im Prinzip dasselbe, du ersetzt halt nicht mit dem dazwischen (s/.../\2/), sondern mit dem Rest (s/.../\1\3/). Wenn der komplette Tag (also nicht nur der Inhalt) weg soll, muss der Teil auch in den inneren Pattern rein, also

Code: Alles auswählen

$ sed 's/\(^.*\)\(<Absender>.*<\/Absender>\)\(.*$\)/\1\3/' /tmp/2013-01-30_23-45-28_AMPEL-234234_40904.rep
Gruss Cae
If universal surveillance were the answer, lots of us would have moved to the former East Germany. If surveillance cameras were the answer, camera-happy London, with something like 500,000 of them at a cost of $700 million, would be the safest city on the planet.

—Bruce Schneier

Benutzeravatar
Meillo
Moderator
Beiträge: 9261
Registriert: 21.06.2005 14:55:06
Wohnort: Balmora
Kontaktdaten:

Re: sed, zeile teilweise wegschneiden.

Beitrag von Meillo » 31.01.2013 16:14:02

Cae hat geschrieben:Ist im Prinzip dasselbe, du ersetzt halt nicht mit dem dazwischen (s/.../\2/), sondern mit dem Rest (s/.../\1\3/).
Vom Prinzip und strukturierten Verstaendnis stimme ich zu, aber aus pragmatischer Sicht ist dieser Ansatz unnoetig kompliziert. Du haettest das fuer dich selbst nie so hingeschrieben.

Wenn man etwas entfernen will, dann matched man es und ersetzt es durch nichts.
Use ed once in a while!

Cae
Beiträge: 6349
Registriert: 17.07.2011 23:36:39
Wohnort: 2130706433

Re: sed, zeile teilweise wegschneiden.

Beitrag von Cae » 31.01.2013 16:24:09

Meillo hat geschrieben:
Cae hat geschrieben:Ist im Prinzip dasselbe, du ersetzt halt nicht mit dem dazwischen (s/.../\2/), sondern mit dem Rest (s/.../\1\3/).
Vom Prinzip und strukturierten Verstaendnis stimme ich zu, aber aus pragmatischer Sicht ist dieser Ansatz unnoetig kompliziert. Du haettest das fuer dich selbst nie so hingeschrieben.
Jupp, ich hatte oben schon fuer den umgedrehten Fall den Ansatz mit den Unterausdruecken. Den hab' ich einfach weiterverwurstet, ohne nachzudenken, was ich eigentlich will... :mrgreen:

Also, Tag plus Inhalt entfernen:

Code: Alles auswählen

$ sed 's/<Absender>.*<\/Absender>//' /tmp/2013-01-30_23-45-28_AMPEL-234234_40904.rep
Gruss Cae
If universal surveillance were the answer, lots of us would have moved to the former East Germany. If surveillance cameras were the answer, camera-happy London, with something like 500,000 of them at a cost of $700 million, would be the safest city on the planet.

—Bruce Schneier

Antworten