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
sed/perl Ausdruck gesucht
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.
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.
Schon einen Schritt weiter:
Das Problem ist, das der Ziel-String <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 <strong> zu löschen, nicht zwischen <desc> und dem Letzten.
Code: Select all
cat Datei.txt | sed -e 's/<desc>.*\<\;strong>/<desc>\ /'
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:
.*? ist die "non-greedy"-Variante von .*, die immer das kleinste mögliche Match auswählt.
Janka
Code: Select all
#!/usr/bin/tclsh
regsub -all {<desc>.*?<strong>} [read stdin] {} OUTPUT
regsub -all {</strong>.*?</desc>} $OUTPUT {} OUTPUT
puts -nonewline $OUTPUT
Janka
Ich vertonne Spam immer in /dev/dsp statt /dev/null.
Ich mag die Schreie.
Ich mag die Schreie.