sed/perl Ausdruck gesucht

Antworten
Nachricht
Autor
Fulter

sed/perl Ausdruck gesucht

#1 Beitrag von Fulter » 13. Feb 2009 11:35

Hallo,

ich suche eine Möglichkeit, in einem Textdokument, alles, was sich zwischen den Tags <desc> und </desc> befindet, zu löschen. Der Einfachheit halber, liegen beide Tags immer in einer Zeile.

So also jemand Spaß an regulären Ausdrücken hat, darf er (oder sie) sich gerne austoben

Fulter

#2 Beitrag von Fulter » 13. Feb 2009 11:48

Kleine Korrektur:

Aus jeder Zeile, die mit <desc> (und beliebigen Tabs und/oder Leerzeichen davor) beginnt, den Inhalt zwischen <desc> und <strong> löschen, sowie den Inhalt zwischen </strong> und </desc>


Die fortgeschrittene Version, aber das würde ich nur wirklich süchtigen oder Gefahrensuchern ans Herz legen:

Alles, was zwischen
1) <desc> und <strong> liegt,
2) zwischen </strong> und <p>, aber nur, wenn nach dem <p> das nächste Zeichen kein < ist, wobei dazwischen natürlich beliebige Leerzeichen liegen können
3) Zwischen </p> und </desc>, aber auch nur, wenn nach dem </p> das nächste Zeichen wieder kein < ist, abgesehen von beliebigen Leerzeichen.

Fulter

#3 Beitrag von Fulter » 13. Feb 2009 13:20

Schon einen Schritt weiter:

Code: Alles auswählen

cat Datei.txt | sed -e 's/<desc>.*\&lt\;strong>/<desc>\ /'
Das Problem ist, das der Ziel-String &lt;strong> in der Zeile mehrfach vorkommt und sed die letzte Instanz nimmt, ich ihm aber beipulen muß, alles zwischen <desc> und dem ersten Auftauchen von &lt;strong> zu löschen, nicht zwischen <desc> und dem Letzten.

Benutzeravatar
Janka
Beiträge: 3581
Registriert: 11. Feb 2006 19:10

#4 Beitrag von Janka » 15. Feb 2009 20:39

Dein Problem lässt sich mit regulären Ausdrücken allein nur mit "non-greedy-quantifiers" lösen. Die kann sed meines Wissens aber nicht. In Tcl sieht das so aus:

Code: Alles auswählen

#!/usr/bin/tclsh
regsub -all &#123;<desc>.*?<strong>&#125; &#91;read stdin&#93; &#123;&#125; OUTPUT
regsub -all &#123;</strong>.*?</desc>&#125; $OUTPUT &#123;&#125; OUTPUT
puts -nonewline $OUTPUT
.*? ist die "non-greedy"-Variante von .*, die immer das kleinste mögliche Match auswählt.

Janka
Ich vertonne Spam immer in /dev/dsp statt /dev/null.
Ich mag die Schreie.

Antworten