• Willkommen im Linux Club - dem deutschsprachigen Supportforum für GNU/Linux. Registriere dich kostenlos, um alle Inhalte zu sehen und Fragen zu stellen.

Eine Zahl aus einem Dokument filtern

kudkud

Newbie
Hi,

ich benötige ein Skript, bzw einen Befehl mit dem ich eine Zahl aus einem Dokument filtern kann.

Beispiel: Die HTML Datei von dem Forum hier. Da taucht irgendwo ein Link auf zB: "http://www.forum.de/posting.php?thread=134"

Dann würde ich diese Zahl (134) gerne in eine Variable bekommen. Ist das möglich?

Mit grep bekomme ich nur die ganz zeile aber villeicht fehlt mir einfach der richtige parameter...
 

ojkastl

Hacker
Steht die Zahl immer am Ende? Oder kommt da manchmal noch was anderes dahinter?

Wenn die am Ende steht, bzw. dahinter eine definierte Zeichenfolge, dann sollte es mit regulären Ausdrücken gehen, da gibt es ein zeichen für das Ende.

da müssen aber die Experten ran, oder du liest die Man-Pages zu den RegExp.
 
OP
K

kudkud

Newbie
Steht leider mitten in der Zeile...

Mit awk soll sowas möglich sein. Werds mal testen...
 

TeXpert

Guru
entweder mit awk oder mit sed (oder gleich mit perl ;) )

das Problem ist, was ist wenn es mehrere solcher URI gibt? die Herausforderung liegt nur darin die richtigen RegEx zu beschreiben.
 

regexer

Advanced Hacker
TeXpert schrieb:
entweder mit awk oder mit sed (oder gleich mit perl ;) )
Als Linux-Bordmittel fällt mich noch tr ein.

So könnte man alle nicht-Ziffern einer Zeile löschen:
Code:
grep wasauchimmer | tr -cd '0-9'
Wie aber TeXpert schon angemerkt hat sollte man sicher sein, dass diese Logik auch immer passt.
 

TeXpert

Guru
die Idee mit tr finde ich spontan nicht so gut ;) das Problem ist, wenn ich für grep die richtige Expression für eine Zeile habe, pipe ich nachher z.b.

Code:
<foo blah bla="3" bar="20" /><a foo bar baz href="http://www.example.org/index.php?thread=123>Thread 123</a>
in die Kiste rein und bekomme bei diesem Beispiel ein:

Code:
 echo '<foo blah bla="3" bar="20" /><a foo bar baz href="http://www.example.org/index.php?thread=123>Thread 123</a>' | tr -cd '0-9'
320123123
d.h. hier ist das Problem, dass grep nur ganze Zeilen bringt und wenn da Zahlen vorkommen werden die alle von tr mitvermischt. IMHO ist die Wahrscheinlichkeit, dass man mit tr auf die Sch**tze fliegt deutlich größer als bei den anderen Dingen.

mit grep und sed musst Du nur eine passende 's/blah\(foo\)blah/\1/' Expression bauen und hast nachher nur noch die Thread-Id, aber dann ist man im Prinzip schon bei Perl ;)
 

regexer

Advanced Hacker
TeXpert schrieb:
Code:
 echo '<foo blah bla="3" bar="20" /><a foo bar baz href="http://www.example.org/index.php?thread=123>Thread 123</a>' | tr -cd '0-9'
320123123
mit grep und sed musst Du nur eine passende 's/blah\(foo\)blah/\1/' Expression bauen und hast nachher nur noch die Thread-Id, aber dann ist man im Prinzip schon bei Perl ;)
Aber zum Thema "tr" muss man sagen: Man könnte natürlich auch alle nicht-Ziffern durch space ersetzen. Das könnte man wiederum in einem for verarbeiten usw.
Code:
for ziffer in $(echo asdf1234asdf5678 | tr -c '0-9' ' ')
do 
  echo $ziffer
done
Das Ergebnis:
1234
5678

Aber: Meine erste Wahl wäre natürlich auch perl ;) Wollte nur eine Alternative zeigen...
 

TeXpert

Guru
wobei Du dann wieder das problem hast, dass Du u.U. kein Ahnung hast, welche Zahlen sonst noch in der zeile stehen, insbesondere in welcher Reihenfolge, daher gewinnst Du damit ein wenig aber nicht viel.

bzgl. perl und sed kommt es sicherlich darauf an, in welchem Rahmen das läuft, ich hab keine Benchmarks, was schneller ist das müsste man u.u. testen :)

denn wenn perl nur dafür geladen wird... hmm, müsste man mal testen. An sich braucht man ja nur den passenden Grep-Ausdruck in als Eingangs-IF und den sed-Ausdruck [1] als entpsrechenden Matching-Ausdruck... evtl. könnte man das auch noch zusammenziehen kommt auf die gesamtaufgabe an ;)



[1]
Code:
 echo '<foo blah bla="3" bar="20" /><a foo bar baz href="http://www.example.org/index.php?thread=123>Thread 123</a>' | sed -e 's/.*www\.example\.org\/index.php?thread=\([[:digit:]]*\).*/\1/'
oder u.u. noch etwas vereinfacht...
 
Oben