PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Wiedereinmal String zerlegen



meinereinerseiner
15-05-2008, 06:46
Hi,

wie könnte ich folgenden String im Shellscript so zerlegen, das alle html tags ausgeblendet werden und ich nur +0,20 bekomme. wobei das auch -x,xx sein kann.


<font class="green">+0,20&nbsp;%</font><br>


thx
der tom

jeebee
15-05-2008, 07:13
Z.B. so (ist wohl nicht das eleganteste ...):
testdata:
<font class="green">+0,20&nbsp;%</font><br>
script:
sed -e 's/&.*//' testdata | sed -e 's/<.*>//'
Falls du als output wirklich +0,20 ohne das &nbsp;% haben willst.

$ cat testdata
<font class="green">+0,20&nbsp;%</font><br>
$ sed -e 's/&.*//' testdata | sed -e 's/<.*>//'
+0,20

meinereinerseiner
15-05-2008, 07:21
danke für die schnelle antwort - funnzt!

mal ne frage zum verständnis - das
's/<.*>//' bewirkt das alles was in den klammern, einschl. selbiger rausgenommen wird, richtig?

warum klappt dann ein:
echo "<font class="green">+0,0100</font> </td>" | sed -e 's/<.*>//' bei mir nicht?



der tom

ContainerDriver
15-05-2008, 08:25
Hallo,



warum klappt dann ein:
echo "<font class="green">+0,0100</font> </td>" | sed -e 's/<.*>//' bei mir nicht?


das klappt schon, aber nicht so wie du denkst ;)
Das Problem ist das gierige Verhalten (http://de.wikipedia.org/wiki/Regul%C3%A4rer_Ausdruck#Gieriges_Verhalten) des regulären Ausdrucks, deshalb hat jeebee vermutlich auch erst die hintere Klammer entfernt.

Gruß, Florian

meinereinerseiner
15-05-2008, 10:19
deshalb hat jeebee vermutlich auch erst die hintere Klammer entfernt.


nein, der 2. String ist ein anderer als der vom 1. Beispiel, ich dachte ich kann das aber auch einfach auf letzteren anwenden, das klappte aber nicht, deswegen mein 2. Posting.

Aber ich scheide im 2. Fall jetzt einfach 10 Zeichen ab, dann passt das.

der tom

ContainerDriver
15-05-2008, 12:44
nein, der 2. String ist ein anderer als der vom 1. Beispiel, ich dachte ich kann das aber auch einfach auf letzteren anwenden, das klappte aber nicht, deswegen mein 2. Posting.

Die Regexp <.*> hätte dir aber auch im ersten Beispielstring schon alles weg gefressen (bzw. sie passt auf den ganzen String). Nur wenn die schließende Klammer am Ende des Ausgangsstrings entfernt wird, passt der Ausdruck wie gewünscht.

Gruß, Florian

jan61
15-05-2008, 23:12
Moin,

extrahiere doch einfach das Muster, das Dich interessiert:
echo "<font class="green">+0,0100</font> </td>" | sed 's/.*\([+-]?[0-9]\+,[0-9]\+\).*/\1/'
# oder
echo "<font class="green">+0,0100</font> </td>" | sed -r 's/.*([[+-]]?[0-9]+,[0-9]+).*/\1/'Jan

EDIT: Hatte das Vorzeichen vergessen

jan61
15-05-2008, 23:35
Moin,


Das Problem ist das gierige Verhalten (http://de.wikipedia.org/wiki/Regul%C3%A4rer_Ausdruck#Gieriges_Verhalten) des regulären Ausdrucks

das kann man aber steuern:
echo "<font class="green">+0,0100</font> </td>" | sed -e 's/<[^>]*>//g'Damit fetze ich nur das weg, was mit "<" anfängt und bis zum nächsten ">" geht (innerhalb der [] wirkt ^ als Negation), und da ich hinten den Modifier "g" angebammelt habe, macht sed das so oft, wie er das Suchmuster findet.

Jan

meinereinerseiner
16-05-2008, 07:17
klasse, klappt - ich werd das regex zeugs nie verstehen :)

danke
der tom

WeenerChild
16-05-2008, 17:47
das kann man aber steuern:

Nein, kann man in sed nicht.
In awk auch nicht, mit (e)grep auch nicht.
In perl (natürlich) schon:

echo "<font class="green">+0,0100</font> </td>" | perl -pe 's/<.*?>//g'
+0,0100
Die Leerzeichen zwischen "</font>" und "</td>" bleiben dabei natürlich erhalten.

jan61
16-05-2008, 19:10
Moin,


[kloogshice]
Nein, kann man in sed nicht....


jan@jack:~/tmp> echo "<font class="green">+0,0100</font> </td>" | sed -e 's/<[^>]*>//g'
+0,0100
Jan

ContainerDriver
16-05-2008, 20:52
Ich glaube WeenerChild will nur darauf hinweisen, dass man in sed nicht das gierige Verhalten mit einer speziellen Option/einem speziellen Quantor ausschalten kann.

Aus der Wikipedia (http://de.wikipedia.org/wiki/Regexp#Gieriges_Verhalten):


Beispiel (Perl-Syntax)
Angenommen es wird auf den String „ABCDEB“ der reguläre Ausdruck A.*B angewendet, so würde er den kompletten String „ABCDEB“ finden. Mit Hilfe des „non-greedy“-Quantors „*?“ passt der neue Ausdruck, also A.*?B, nur auf die Zeichenkette „AB“, bricht also die Suche nach dem ersten gefundenen „B“ ab.


Gruß, Florian

jan61
16-05-2008, 21:14
Moin,


Ich glaube WeenerChild will nur darauf hinweisen, dass man in sed nicht das gierige Verhalten mit einer speziellen Option/einem speziellen Quantor ausschalten kann.

ja, das war offensichtlich. Aber das hatte (wie auch schon hier: http://www.mrunix.de/forums/showthread.php?t=58132) wieder mal überhaupt nichts mit meinem Posting zu tun und seine Kernaussage "geht nicht" ist schlicht und einfach Schwachsinn. Dass es mit dem "?"-Quantifier nicht geht heißt noch lange nicht, das es nicht geht. Und nichts anderes habe ich geschrieben. Hätte er sich die Mühe gemacht und sich mein Posting mal richtig durchgelesen und wenigstens versucht, den Inhalt zu verstehen (oder den sed ausprobiert - so schwer kann es doch nicht sein, sich ein Stück aus einem Posting zu kopieren und dann mal in einer Shell abzusetzen), anstelle reflexartig beim ersten Reizwort oder -satzteil wie ein Duracell-Hase anzuspringen und Quark abzusondern, dann würden die Threads zum Teil deutlich kürzer sein.

SCNR
Jan

WeenerChild
17-05-2008, 22:23
Dass es mit dem "?"-Quantifier nicht geht heißt noch lange nicht, das es nicht geht.
Doch, exakt das heißt es. Man kann die quantifier in sed nicht "ungreedy" machen. Das ist völlig unmöglich.

<[^>]*>
Der asterisk matcht hier immer noch soviel Zeichen wie möglich (hier sinds alle Zeichen außer ">"). Das ist ein funktionierender Workaround, nicht mehr, nicht weniger. Der quantifier matcht greedy, da kannst du (in sed) absolut nichts gegen unternehmen. Das ist nun einmal so, wenn du in deiner Traumwelt leben willst und meinst, nur weil das Ergebnis dasselbe ist der Vorgang der zum Ergebnis führt auch identisch ist dann glaubst du wohl auch, dass "2^5" und "31 + (5 * 7 - 34)" das Gleiche ist. "Oh, kommt ja bei beidem 32 raus, muss wohl exakt dasselbe sein!"


(oder den sed ausprobiert - so schwer kann es doch nicht sein, sich ein Stück aus einem Posting zu kopieren und dann mal in einer Shell abzusetzen)
Genau, weil ich zu blöd bin zu kapieren was "s/<[^>]*>//g" macht, omfg... Dazu muss ich nix copy'n'pasten.
Ich wollte nur (korrekterweise) anmerken, dass man in sed die greedyness der quantifier nicht steuern kann. Entgegen deiner Aussage.

Und könntest du mal vom kleinen edit button an deinen Postings Gebrauch machen? Mehrfachpostings sind, hm, vermeidbar.

jan61
20-05-2008, 01:12
Doch, exakt das heißt es. Man kann die quantifier in sed nicht "ungreedy" machen.

Siehst Du, da ist wieder Dein Problem: Du kannst nicht lesen! Das habe ich nämlich nie behauptet. Gewöhn Dir endlich mal an, aus meinen Postings das zu lesen, was ich geschrieben habe, und nicht das, was Du (äußerst willkürlich) hinein interpretierst! Ich habe geschrieben, dass man das gierige Verhalten der regex steuern kann, und zwar (wie an meinem Beispiel unschwer zu erkennen ist) mit einem geeigneten regulären Ausdruck - vom "?"-Quantifier war überhaupt keine Rede.


Das ist ein funktionierender Workaround, nicht mehr, nicht weniger.

So ein Schwachsinn. Genauso gut kannst Du den ?-Quantifier in Perl als Workaround für Leute bezeichnen, die von regex keine Ahnung haben. Geschätzte 90% aller Lösungen, die in der Praxis damit arbeiten, könnten ihre Aufgaben durch geeignete regex genauso lösen. ? ist in den meisten Fällen eine Schreiberleichterung, die durch kompaktere regex das Lesen und Verstehen des Codes erleichtert (und vielleicht - ich kenne die Perl-Interna für eine Einschätzung zu wenig - Performance bringt).


Das ist nun einmal so, wenn du in deiner Traumwelt leben willst und meinst, nur weil das Ergebnis dasselbe ist der Vorgang der zum Ergebnis führt auch identisch ist dann glaubst du wohl auch, dass "2^5" und "31 + (5 * 7 - 34)" das Gleiche ist. "Oh, kommt ja bei beidem 32 raus, muss wohl exakt dasselbe sein!"

Was willst Du später mal werden? Demagoge? Du weißt doch genau, dass Deine Analogie sowas von daneben ist. Probier Deinen Perl-Code doch einfach mal zusammen mit meinem sed an identischen Testdaten aus und zeig mir die Unterschiede. Unsere beiden Varianten bilden nämlich exakt das gleiche Verhalten ab.
2 * 2 * 2 * 2 * 2 = 32 - auch falsch? Wahrscheinlich - kommt ja nicht von Dir.


Ich wollte nur (korrekterweise) anmerken, dass man in sed die greedyness der quantifier nicht steuern kann. Entgegen deiner Aussage.Nein, das wolltest Du nicht - weil das nämlich gar nicht meine Aussage war. Du hast behauptet "kann man in sed nicht" - und dann was ganz Anderes erzählt. Deine Aussage, dass es mit dem ?-Quantifier in allen nicht Perl-kompatiblen Regex-Implementierungen (das beinhaltete ja Deine Aufzählung, Java und die pcre-Lib wären hingegen weitere Beispiele für Perl-kompatible Implementierungen) nichts wird, hat keiner bezweifelt. Aber das hatte nichts mit meinem Posting zu tun.


Und könntest du mal vom kleinen edit button an deinen Postings Gebrauch machen? Mehrfachpostings sind, hm, vermeidbar.Hä? Was für ein Mehrfachposting? Habe ich aus Versehen ein Knöpfchen zu viel oder zu wenig gedrückt? Bitte untertänigst um Verzeihung. Aber einen kleinen Rat hätte ich dann auch für Dich, sozusagen als Dankeschön: Schau mal ab und zu in den Duden - z. B. wie man "(hirn)verbrannt" schreibt (http://www.mrunix.de/forums/showthread.php?p=263541). SCNR

Jan

meinereinerseiner
20-05-2008, 07:55
oha - was ist denn hier los - macht doch bitte keine grundsatzdiskussion aus meinem kleinen Problem.... vor allem nicht bei diesem super wetter. so'n lecker bierchen kühlt noch jedes gemüt!

also prost und vielen dank für euer hilfe!

der tom