Diese Website existiert nur weil wir Werbung mit AdSense ausliefern.
Bitte den AdBlocker daher auf dieser Website ausschalten! Danke.

Eine Zahl aus einem Dokument filtern

Alles rund um die verschiedenen Konsolen und shells sowie die Programmierung unter Linux

Moderator: Moderatoren

Antworten
kudkud
Newbie
Newbie
Beiträge: 5
Registriert: 15. Sep 2005, 11:02

Eine Zahl aus einem Dokument filtern

Beitrag von kudkud »

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
Hacker
Beiträge: 547
Registriert: 15. Dez 2004, 04:51
Wohnort: Erlangen
Kontaktdaten:

Beitrag von ojkastl »

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.
kudkud
Newbie
Newbie
Beiträge: 5
Registriert: 15. Sep 2005, 11:02

Beitrag von kudkud »

Steht leider mitten in der Zeile...

Mit awk soll sowas möglich sein. Werds mal testen...
Benutzeravatar
TeXpert
Guru
Guru
Beiträge: 2166
Registriert: 17. Jan 2005, 11:22

Beitrag von TeXpert »

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.

Code: Alles auswählen

# to resolve all your problems, try this:
HOWTO='pack c5,41*2,sqrt 7056,unpack(c,H)-2,oct 115' && perl -le "print $HOWTO"
Ich beantworte keine Supportfragen per PM!
Benutzeravatar
regexer
Advanced Hacker
Advanced Hacker
Beiträge: 1005
Registriert: 3. Dez 2004, 09:29
Wohnort: $_

Beitrag von regexer »

TeXpert hat geschrieben: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: Alles auswählen

grep wasauchimmer | tr -cd '0-9'
Wie aber TeXpert schon angemerkt hat sollte man sicher sein, dass diese Logik auch immer passt.
Benutzeravatar
TeXpert
Guru
Guru
Beiträge: 2166
Registriert: 17. Jan 2005, 11:22

Beitrag von TeXpert »

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: Alles auswählen

<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: Alles auswählen

 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 ;)

Code: Alles auswählen

# to resolve all your problems, try this:
HOWTO='pack c5,41*2,sqrt 7056,unpack(c,H)-2,oct 115' && perl -le "print $HOWTO"
Ich beantworte keine Supportfragen per PM!
Benutzeravatar
regexer
Advanced Hacker
Advanced Hacker
Beiträge: 1005
Registriert: 3. Dez 2004, 09:29
Wohnort: $_

Beitrag von regexer »

TeXpert hat geschrieben:

Code: Alles auswählen

 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: Alles auswählen

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...
Benutzeravatar
TeXpert
Guru
Guru
Beiträge: 2166
Registriert: 17. Jan 2005, 11:22

Beitrag von TeXpert »

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: Alles auswählen

 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...

Code: Alles auswählen

# to resolve all your problems, try this:
HOWTO='pack c5,41*2,sqrt 7056,unpack(c,H)-2,oct 115' && perl -le "print $HOWTO"
Ich beantworte keine Supportfragen per PM!
Antworten