Zeilen kopieren mit SED

T

tsueri87

Gast
Hallo liebe Forumsleute

ich bin noch relativ unerfahren mit der Shell und bin aber fleissig am Experimentieren und Lösungen für meine Probleme zu finden. Nun stehe ich aber bei einem Problem an, bei dem ihr mir hoffentlich weiterhelfen könnt.

Aufgabe: Ich muss in rund 1000 xml-Dateien jeweils zwei Zeilen verschieben. Alle Dateien sind gleich strukturiert, von daher sollte es also keine Probleme geben. Und zwar geht es darum, dass ich die Zeile 20 auf die Zeile 8 kriege. Die Originaldatei sieht folgendermassen aus:

Originaldatei:
1 ?xml version="1.0" encoding="UTF-8"?>
2 <document xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
3 xsi:noNamespaceSchemaLocation="vorlage.dtd">
4 <meta>
5 <id>200455</id>
6 <author></author>
7 <url></url>
8 <date></date>
[...]
19 <text>
20 <date>1941-06-01</date>

Ich hab dazu ein sed-Script mit Hilfe vieler Forenbeiträge gebastelt, aber irgendwie funktioniert es nicht:

Code:
for file in *.xml; do sed -i -f -e '20{h;d}' -e '8g' $file; done

Wenn ich es laufen lasse, dann krieg ich folgende Fehlermeldung:

sed: 1: "20{h;d}
": extra characters at the end of d command

Kann mir jemand weiterhelfen? Ich hab schon einiges ergoogelt, steh aber voll auf dem Schlauch :s.
Danke schon zum Voraus!
LG Tsueri
 

floyd62

Routinier
Beiträge
324
Hi,

sicher, dass da keine nicht druckbaren Zeichen in deinem Skript enthalten sind? Eigentlich läuft das Skript bei mir ohne Fehlermeldung (wenn ich die Option '-f' weglasse - die brauchst du nur, wenn du die sed-Befehle nicht mit '-e' auf der Kommandozeile angibst sondern aus einem sed-Skript liest.)

Dass das trotzdem nicht das gewünschte Ergebnis liefert, liegt daran, dass sed zeilenweise arbeitet; in Zeile 8 ist der Hold-Buffer aber noch leer, du bekommst mit dem 'g' also nur eine zusätzliche Leerzeile, nicht die Zeile 20, die erst später wegkopiert und gelöscht wird.

Für solche Fälle ist evtl. 'ed' einfacher, etwa so:
Code:
for xml in *.xml; do
        ( echo 20m7; echo wq ) | ed $xml
done

Gruss, A.
 

Ähnliche Themen

Zeilen löschen und ersetzen mit sed

Displayport + externer Monitor zeigt bei startx nichts erst bei DVI

NagiosGrapher 1.7.1 funktioniert nicht

sed im script per crontab

ATI-fglrx unter Ubuntu Hardy - Logoff Issue

Sucheingaben

in linux zeilen verschieben

Oben