staging.inyokaproject.org

Zeile mit Ziffern mittels sed entfernen

Status: Gelöst | Ubuntu-Version: Ubuntu 19.04 (Disco Dingo)
Antworten |

teufelschultz

Anmeldungsdatum:
25. Mai 2010

Beiträge: Zähle...

Hallo,

ich habe eine XML-Datei aus der die Zeile mit der Kanalnummer (im folgenden Beispiel Nummer 6) gelöscht werden soll.

1
2
3
4
<channel id="448444101317df20f7dd9cb47eec43f3">
  <display-name>VOX HD</display-name>
  <display-name>6</display-name>
</channel>

Das klappt auch mit den Befehlen:

sed -i 's/^ *<display-name>[0-9].*//g' /volume1/web/guide.xml
sed -i '/^$/d' /volume1/web/guide.xml

Leider wird dabei bei folgenden Sender auch die Zeile mit dem Sendernamen entfernt, da dieser eine Ziffer beinhaltet.

1
2
3
4
<channel id="8595180589a391c2117f871114b07678">
  <display-name>3sat HD</display-name>
  <display-name>94</display-name>
</channel>

Kann mir einer sagen wie der sed Befehl angepasst werden muss, damit nur Zeilen mit Ziffern ohne folgende Buchstaben (also der Kanalname) entfernen werden?

Das gewünschte Ergebnis wäre also:

1
2
3
<channel id="8595180589a391c2117f871114b07678">
  <display-name>3sat HD</display-name>
</channel>

wxpte

Avatar von wxpte

Anmeldungsdatum:
20. Januar 2007

Beiträge: 1004

Wie wäre es mit

sed -i '/>[0-9]\+</d' /volume1/web/guide.xml

Dann bräuchtest du nicht einmal mehr die zweite Zeile.

teufelschultz

(Themenstarter)

Anmeldungsdatum:
25. Mai 2010

Beiträge: 13

Funktioniert super. Vielen Dank für die schnelle Antwort.

rklm Team-Icon

Projektleitung

Anmeldungsdatum:
16. Oktober 2011

Beiträge: 12527

Da es so schön zeilenweise organisiert ist, geht das auch mit egrep -v:

1
2
3
4
5
6
7
8
9
$ egrep -v '<display-name>[0-9]+</display-name>' <<DATA
> <channel id="8595180589a391c2117f871114b07678">
>   <display-name>3sat HD</display-name>
>   <display-name>94</display-name>
> </channel>
> DATA
<channel id="8595180589a391c2117f871114b07678">
  <display-name>3sat HD</display-name>
</channel>

Eigentlich sollte man dafür aber ein XML-Werkzeug verwenden, z.B. xmlstarlet. Meine Version kennt aber matches() nicht. Da müsste man dann was anderes nehmen.

wxpte

Avatar von wxpte

Anmeldungsdatum:
20. Januar 2007

Beiträge: 1004

rklm schrieb:

Da es so schön zeilenweise organisiert ist, geht das auch mit egrep -v:

Stimmt, viele Wege führen nach Rom. Ich würde das ganze sogar innerhalb von Vim mit dem Befehl

:%!egrep -v ">[0-9]+<"

durchführen. Das hätte den Vorteil, dass man vorher nochmals überprüfen kann, dass auch die passenden Zeilen weggeräumt wurden, bevor man die Datei wieder abspeichert.

teufelschultz

(Themenstarter)

Anmeldungsdatum:
25. Mai 2010

Beiträge: 13

Da das "Aufräumen" mittels Script in einer Routine automatisiert abläuft, möchte ich gar nicht manuell kontrollieren. Für mich funktioniert die Variante mit sed wie gewünscht, aber vielen Dank für die weiteren Lösungsvorschläge.

Antworten |