mit sed Zeilen auf einmal löschen

Du suchst ein Programm für einen bestimmten Zweck?
Antworten
root2root
Beiträge: 168
Registriert: 22.10.2007 13:06:29

mit sed Zeilen auf einmal löschen

Beitrag von root2root » 05.08.2010 00:20:00

Hallo Team
ich hab eine Datei mit 15 Zeilen Text.
Nu habe ich von sed gelesen, daß man Zeilen löschen kann.

Aus meiner Datei möchte ich die 3. 5. 9. und 17. Zeile gleichzeitig löschen.

Wie geht das bitte ?

Danke
Gruß root2root

Benutzeravatar
GoKi
Beiträge: 2068
Registriert: 04.07.2003 23:08:56
Lizenz eigener Beiträge: MIT Lizenz

Re: mit sed Zeilen auf einmal löschen

Beitrag von GoKi » 05.08.2010 00:40:53

z.B.

Code: Alles auswählen

sed -i -e '3d' -e '5d' -e '9d' -e '17d' datei.txt
Wobei ich mich gerade Frage, wie man aus einer 15-zeiligen Datei die 17. Zeile löscht....
MfG GoKi
:wq

roli
Beiträge: 3174
Registriert: 10.09.2003 17:39:58

Re: mit sed Zeilen auf einmal löschen

Beitrag von roli » 05.08.2010 08:53:55

Hi,
GoKi hat geschrieben:z.B.

Code: Alles auswählen

sed -i -e '3d' -e '5d' -e '9d' -e '17d' datei.txt
ohne es gerade testen zu koennen, aber funktioniert das so wirklich? Muesste man nicht "von hinten nach vorne" loeschen, also

Code: Alles auswählen

sed -i -e '17d' -e '9d' -e '5d' -e '3d' datei.txt
da nach dem loeschen von Zeile 3 der Inhalt von Zeile 5 mittlerweile in Zeile 4 steht?
Roland


"Aber wenn du schon so unwissend bist, davon noch nicht gehört zu haben,
so will ich es doch als gut ansehen, daß du lieber einmal töricht fragst,
als weiterhin nichts von etwas zu wissen, das man doch wissen sollte."
aus "Die Edda des Snorri Sturluson", "Gylfis Täuschung"

dimi
Beiträge: 84
Registriert: 19.07.2006 14:09:55

Re: mit sed Zeilen auf einmal löschen

Beitrag von dimi » 05.08.2010 09:13:49

da nach dem loeschen von Zeile 3 der Inhalt von Zeile 5 mittlerweile in Zeile 4 steht?
Die Datei wird erst geschrieben wenn das Programm durchgelaufen ist, d.h. alle Eingabezeilen bearbeitet hat. Deswegen "fehlt" bei diesen noch keine Zeile.

Außerdem würde die Änderung der Abfolge der Parameter in diesem Fall nichts bewirken, weil sed den Addressteil aller Anweisung mit dem der gerade eingelesenen Zeile vergleicht und bei Übereinstimmung die Anweisung ausführt. Die Zeilen werden bei beiden Varianten in der gleichen Reihenfolge gelöscht.

gms
Beiträge: 7798
Registriert: 26.11.2004 20:08:38
Lizenz eigener Beiträge: MIT Lizenz

Re: mit sed Zeilen auf einmal löschen

Beitrag von gms » 05.08.2010 12:07:25

tippt sich leichter:

Code: Alles auswählen

sed -ie '3d;5d;9d;17d' datei.txt
Gruß
gms

root2root
Beiträge: 168
Registriert: 22.10.2007 13:06:29

Re: mit sed Zeilen auf einmal löschen

Beitrag von root2root » 07.08.2010 07:15:17

Tolle Stats
Dank euch allen.

@gms,

sed -ie '3d;5d;9d;17d' datei.txt


ich hab folgendes versucht
tmp="sed -ie '3d;5d;9d;17d'"
$tmp datei,txt

Meldung:
sed: -e Ausdruck #1, Zeichen 1: Unbekannter Befehl: `''


gruß root2root

dimi
Beiträge: 84
Registriert: 19.07.2006 14:09:55

Re: mit sed Zeilen auf einmal löschen

Beitrag von dimi » 07.08.2010 10:07:29

Meldung:
sed: -e Ausdruck #1, Zeichen 1: Unbekannter Befehl: `''
Dann lass es doch weg :)

Code: Alles auswählen

tmp='sed -ie 3d;5d;9d;17d'
$tmp datei,txt

root2root
Beiträge: 168
Registriert: 22.10.2007 13:06:29

Re: mit sed Zeilen auf einmal löschen

Beitrag von root2root » 10.08.2010 08:52:12

hallo dimi

muß es nicht heissen

tmp='sed -ie '3d;5d;9d;17d' '

mit extra separierten Steuersätzen '3d...'
oder erkenn die bash das auch so ?

gruß root2root

gms
Beiträge: 7798
Registriert: 26.11.2004 20:08:38
Lizenz eigener Beiträge: MIT Lizenz

Re: mit sed Zeilen auf einmal löschen

Beitrag von gms » 10.08.2010 10:55:37

korrekt wäre etwa:

Code: Alles auswählen

tmp="sed -ie '3d;5d;9d;17d'"
eval $tmp ./datei.txt
oder

Code: Alles auswählen

tmp='sed -ie 3d;5d;9d;17d'
$tmp datei.txt

Wozu soll diese tmp-Variable gut sein ?

root2root
Beiträge: 168
Registriert: 22.10.2007 13:06:29

Re: mit sed Zeilen auf einmal löschen

Beitrag von root2root » 10.08.2010 16:19:51

ich habe folgendes vor:

In einem zyklus werden dateien zn.txt generiert:
anhand dieser datei zn.txt soll ein sed-befehl augebaut werden, wo dieser inhalt anschliessend in den befehlsargumenten auftaucht

cat zn.txt
3
5
9
17

abgebildet in sed -ie '3d;5d;9d;17d'. Dazu brauche ich ein kleines Shellscript, einen Ansatz habe ich hier mal erzeugt
http://debianforum.de/forum/viewtopic.p ... 15#p700026

leider bisher ohne erfolg bzw. mit dem geschilderten fehler.
hat jemand eine idee ??

Danke euch + Gruß
root2root

gms
Beiträge: 7798
Registriert: 26.11.2004 20:08:38
Lizenz eigener Beiträge: MIT Lizenz

Re: mit sed Zeilen auf einmal löschen

Beitrag von gms » 10.08.2010 18:02:31

Code: Alles auswählen

gms@sirius ~ $ for((i=1;$i<15;i++)); do echo $i; done >datei.txt 
gms@sirius ~ $ for((i=1;$i<15;i+=3)); do echo $i; done >liste.txt

gms@sirius ~ $ X=($(<liste.txt)) # speichert liste.txt in ein Array X
gms@sirius ~ $ Y="${X[@]}" # wandelt das Array X in ein mit Leerzeichen getrennte Kette um und speichert diese in Y
gms@sirius ~ $ Z="${Y// /d;}d;" # ersetzt die Leerzeichen mit 'd;' und hängt an das Ende auch noch ein 'd;' an
gms@sirius ~ $ echo $Z  # Z schaut dann so aus:
1d;4d;7d;10d;13d;
gms@sirius ~ $ sed -ie $Z datei.txt 
gms@sirius ~ $ cat datei.txt
2
3
5
6
8
9
11
12
14
gms@sirius ~ $ 

root2root
Beiträge: 168
Registriert: 22.10.2007 13:06:29

Re: mit sed Zeilen auf einmal löschen

Beitrag von root2root » 12.08.2010 13:28:28

Hi gms,
kann man das pipen :

Versuch:
Z=$( $(<liste.txt) | "${X[@]}" | "${Y// /d;}d;" )

Gruß root2root

gms
Beiträge: 7798
Registriert: 26.11.2004 20:08:38
Lizenz eigener Beiträge: MIT Lizenz

Re: mit sed Zeilen auf einmal löschen

Beitrag von gms » 12.08.2010 14:25:23

läßt sich besser ohne Pipe zusammenfassen:

Code: Alles auswählen

sed -ie $(awk '{l=l $0 "d;" } END{print l }' liste.txt ) datei.txt
durch das Zusammenfassen leidet allerdings auch die Fehlerbehandlung. So würden bei diesem Kommando, wenn liste.txt leer ist, alle Zeilen aus datei.txt gelöscht. Das könntest du aber im awk-Teil z.B im END-Block berücksichtigen

Antworten