sed / regular exp

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
Benutzeravatar
chabayo
Beiträge: 930
Registriert: 17.08.2005 07:44:33
Lizenz eigener Beiträge: Artistic Lizenz

sed / regular exp

Beitrag von chabayo » 02.12.2006 06:42:42

Hallo,

ich mag lediglich alle (A)nker-Tags aus einem Html-File haben; dazu dachte ich mir folgenden Ausdruck:

Code: Alles auswählen

sed -ne "s/<a[^>.]*>/&/p" file.html
...aber das haut nicht hin.

Lass ich das a draussen krieg ich natuerlich alle Tags...aber ich will es ja auf die Anker-Tags beschraenkt haben.
Watt about the non-digital!?

Benutzeravatar
Duff
Beiträge: 6321
Registriert: 22.03.2005 14:36:03
Wohnort: /home/duff

Beitrag von Duff » 02.12.2006 12:43:13

Hast du eine Beispieldatei (oder nur ein paar Zeilen), damit man die eigenen Vorschläge auch vorher mal testen kann.

Danke.
Oh, yeah!

Benutzeravatar
chabayo
Beiträge: 930
Registriert: 17.08.2005 07:44:33
Lizenz eigener Beiträge: Artistic Lizenz

Beitrag von chabayo » 02.12.2006 16:25:57

Hm...

...sollten eigentlich genug html-Files im Internet zu finden sein :roll:

:lol:

Naja, vorstellbar waer ja kurz das:

Code: Alles auswählen

Schoene Datei mit <a href="/tmp">Link</a>
Generell waere mir sogar lieber ich koennte das Tag mit dem Wort 'tmp' abgreifen, weil ich eigentlich aus einer Website Links herausziehen will, die hier speziell auf ein Unterverzeichnis dessen Pfad 'download' enthaelt verweisen.

Genauer hatte ich mir dann in etwa folgendes forgestellt:

Code: Alles auswählen

wget -O - http://website.de | sed sed -ne 's/<a[^>.]*>/&/p' -ne 's/'href="[^".]*"'/&/p' | cut -d '"' -f 2

BTW - waere sowas ne Perl-Spezialitaet?


thx
chab
Watt about the non-digital!?

Benutzeravatar
markus_b
Beiträge: 355
Registriert: 26.01.2006 04:57:18
Lizenz eigener Beiträge: MIT Lizenz

Beitrag von markus_b » 02.12.2006 18:11:06

Mein Vorschlag:

Code: Alles auswählen

sed -nre 's/^.*<a[[:blank:]]+href="([^"]*)".*$/\1/p' index.html
Das gibt dir den Inhalt von href aller <a> Tags aus.

Wenn du noch weiter Filtern willst, dann kannst du das einfach in die Klammern schreiben:

Code: Alles auswählen

sed -nre 's/^.*<a[[:blank:]]+href="(\/tmp[^"]*)".*$/\1/p' index.html

Benutzeravatar
puddlejumper
Beiträge: 58
Registriert: 22.01.2005 00:29:52

Beitrag von puddlejumper » 03.12.2006 01:38:44

Hi,

wenn Du schon nach perl fragst...:

Code: Alles auswählen

wget ... | perl -e 'while (<>) { if (/<a +.*?href="(.*?)"/) { print $1 . "\n"; }'
Gruß,
puddlejumper.

fuzzy
Beiträge: 1021
Registriert: 04.10.2003 12:15:52

Beitrag von fuzzy » 03.12.2006 08:59:22

Hallo chabayo,

Code: Alles auswählen

wget -qO- debianforum.de  | tr " " "\n" | sed '/href="\//!d;s/[^"]*"\/\(.*\)".*/\1/'
geht das in die richtige Richtung?

Gruß fuzzy

Benutzeravatar
chabayo
Beiträge: 930
Registriert: 17.08.2005 07:44:33
Lizenz eigener Beiträge: Artistic Lizenz

Beitrag von chabayo » 04.12.2006 09:47:43

Hm...

...hab mir mal das Paket "visual-regex" installiert, und sie gegengeprueft...es liegt leider nicht an der Regular Expression, denn die ist tatsaechlich korrekt.

Code: Alles auswählen

sed -e "s/<a[^>.]*>/###&###/" file.html
zeigt das auch.

Es ist, wie das von markus_b zeigt denn die Funktioniert, ein technischer Kniff in der handhabund von sed.

Gibt es nichts das einfach den Match fuer das Pattern ausgibt?? - waer ja zu doof.



thx@all




@fuzzy: ...just btw., die Perlline funktioniert, aber es ist am Ende eine } zu wenig.
Watt about the non-digital!?

nepos
Beiträge: 5238
Registriert: 05.01.2005 10:08:12

Beitrag von nepos » 04.12.2006 10:19:03

Wenn Perl, dann würde ich das nicht über eine reine RegEx machen. Das kann immer mal wieder schiefgehen. Vielmehr würde ich da eines der diversen Module wie z.B. HTML::Parser oder ähnliches benutzen.

Antworten