Zeilen löschen und ersetzen mit sed

H

h.nietnagel

Grünschnabel
... sollte eigentlich ganz einfach sein. Dachte ich. Jetzt probiere ich schon seit mehr als einer Stunde an einem ganz simplen Problem herum:

ich habe viiieeeele Textdateien, die alle nach dem selben Muster aufgebaut sind.
Ich möchte in diesen mittels eines Shellskriptes und sed einige Zeilen löschen und in 2 Zeilen die Zahl "5" jeweils mit der Zahl "3" ersetzen.

So sieht - nach vielem Lesen im Netz - mein Skript jetzt aus:
Code:
for i in *.prt; do
sed -n '39,40!p' -e -n '48,49!p' -e '35s/5/3/g' -e '44s/5/3/g' $i > ${i%.*}edit.prt
done
Wenn ich das an einer Datei probiere, bekomme ich folgende Fehlermeldung:
Code:
sed: -e: No such file or directory
sed: -n: No such file or directory
sed: 48,49!p: No such file or directory
sed: -e: No such file or directory
sed: 35s/5/3/g: No such file or directory

Wenn ich versuche, das aufzudröseln, dann kommt zwar keine Fehlermeldung:
Code:
for i in *.prt; do
sed -n '39,40!p' -e -n '48,49!p' $i > ${i%.*}edit.prt 
done
aber mir die Datei inklusive Zeilen 39 und 40, und exklusive Zeilen 48 und 49 angezeigt. Ich dachte aber, dass, wenn ich das Löschen der beiden Zeilen (wie funktioniert bei sed eigentlich die Angabe von NICHT aufeinanderfolgenden Zeilen, also z.B. Zeile 39 und Zeile 48? Ich finde überall nur Hinweise auf: Zeilen 2 bis 20 usw.) in einem "Rutsch angebe", dann würden auch beide Angaben berücksichtigt.

Kann mir jemand weiterhelfen? Was mache ich falsch, bzw. habe ich nicht richtig verstanden?


Vielen Dank im Voraus für Tipps!

Schöne Grüße,
Hannes
 
Hallo Hannes,
LÖSCHEN kannst Du auch zwei Zeilen gleichzeitig. Beispiel: Lösche Zeile 2 und 4, den Rest der Datei ausgeben:
Code:
sed -e '2d;4d' DATEI >NEUEDATEI
Sieh es als Ansatz für Deine Gesamtlösung.
Gruß zst
 
Hi,

zunächst einmal: wenn ich die Manual-Page richtig interpretiere musst du _alle_ sed-Befehle mit -e einleiten, wenn du mehrere kombiieren willst, da sonst nur der erste Ausdruck als Kommando, alle danach folgenden als Eingabedateien interpretiert werden. Das führt dann ganz klar zu den Fehlermeldungen wie '-e: no such file or directory'.

Wenn ich das richtig verstehe, willst du
- Zeilen 39 und 40 löschen
- Zeilen 48 und 49 löschen
- und in Zeile 35 und 44 alle '5' mit '3' ersetzen

Das sollte eigentlich ganz systematisch etwa so umzusetzen sein:
Code:
sed -e '
        39,40d         # lösche Z. 39, 40,
        48,49d         # 48 und 49,
        35s/5/3/g      # und ersetze in Zeile 35
        44s/5/3/g'     # und 44 jeweils 5 durch 3
' $i > ${i%.*}edit.prt
in einer Zeile also z.B.
Code:
sed -e '39,40d' -e '48,49d' -e '35s/5/3/g' -e '44s/5/3/g' ...
oder
Code:
sed -e '39,40d; 48,49d; 35s/5/3/g; 44s/5/3/g'

Gruss, A.
 
Hallo floyd62,

tausend Dank! Das war DIE Lösung! Und ich war soooo... nah dran! Ich hab wohl irgendwie beim Lesen der Beispiele im Netz übersehen, dass die Befehle, die alle zusammen in einem Rutsch ausgeführt werden sollen, innerhalb von EINEM Paar Hochkommata stehen müssen. Welch dummer Fehler von mir!

Vielen Dank für die Hilfe! So hat alles wunderbar geklappt!


Schöne Grüße,
Hannes
 

Ähnliche Themen

Verschlüsseltes Backup-Script mit rsync

Keine grafische Oberfläche (Debian Installation)

[Gelöst] Suchen und ersetzen mit Hilfe mehrerer Parameter

String einer bestimmten Zeile durchsuchen

Ich mag Dovecot nicht ...

Zurück
Oben