SED-Filter-Problem

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
K.I.T.T.
Beiträge: 104
Registriert: 14.11.2005 11:33:38

SED-Filter-Problem

Beitrag von K.I.T.T. » 07.06.2006 21:08:18

Hi.

Ich habe hier ein kleines Problem...

Code: Alles auswählen

echo '<a href="abc"></a><a href="cba"></a>' | sed -n -e 's/\(^.*<a href="\)\([^"]*\)\(".*$\)/\2/gp'
eigentlich wollte ich damit die Ausgabe:

Code: Alles auswählen

abc
cba
erreichen, doch leider bekomme ich nur ein Wie liegt der (kleine) fehler?

Gruß

*Nachtrag*

Auch

Code: Alles auswählen

echo '<a href="abc"></a>\n<a href="cba"></a>' | sed -n 's/.*href="*\([^">]*\)[">].*/\1/pi'
will nicht. SED verlangt scheinbar regelrecht nach einem Enter dazwischen :-(

K.I.T.T.
Beiträge: 104
Registriert: 14.11.2005 11:33:38

Beitrag von K.I.T.T. » 07.06.2006 23:58:40

Ich hab es jetzt mal so

Code: Alles auswählen

echo '<a href="abc"></a><a href="cba"></a>' |  sed -e "s/<a/\n<a/g" | sed -n -e 's/\(^.*<a href="\)\([^"]*\)\(".*$\)/\2/gp'
gelöst.
Es wirkt allerdings etwas unsauber.

Benutzeravatar
meandtheshell
Beiträge: 4054
Registriert: 14.01.2005 17:51:30

Beitrag von meandtheshell » 08.06.2006 08:30:47

sed ist für das was du willst IMHO das falsche Tool

Code: Alles auswählen

max@pc1:~$ echo '<a href="abc"></a><a href="cba"></a>' | cut -d '"' -f 2 && echo '<a href="abc"></a><a href="cba"></a>' | cut -d '"' -f 4
abc
cba
Das geht sicher noch besser, war aber eine 4sec Aktion.

markus

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

Beitrag von fuzzy » 08.06.2006 19:49:14

...hier noch ein vorschlag.

Code: Alles auswählen

fuzzy@free:/tmp$ echo '<a href="abc"></a><a href="cba"></a>' | awk -F '"' '{print$2"\n"$4}'
abc
cba
hat bei mir leider deutlich länger als 4s gedauert :wink:

Gruß fuzzy

Benutzeravatar
Joghurt
Beiträge: 5244
Registriert: 30.01.2003 15:27:31
Wohnort: Hamburg
Kontaktdaten:

Beitrag von Joghurt » 08.06.2006 20:09:10

Wie wär's mit Python?

Code: Alles auswählen

#!/usr/bin/python
from htmllib import HTMLParser
from formatter import NullFormatter
import sys

p = HTMLParser(NullFormatter())
for line in sys.stdin:
  p.feed(line)
for a in p.anchorlist:
  print a
Beispiel:

Code: Alles auswählen

echo "<a href='foo'><a href='bar'>" | listhtmlanchors.py

K.I.T.T.
Beiträge: 104
Registriert: 14.11.2005 11:33:38

Beitrag von K.I.T.T. » 08.06.2006 23:06:16

fuzzy hat geschrieben:...hier noch ein vorschlag.

Code: Alles auswählen

fuzzy@free:/tmp$ echo '<a href="abc"></a><a href="cba"></a>' | awk -F '"' '{print$2"\n"$4}'
abc
cba
hat bei mir leider deutlich länger als 4s gedauert :wink:
In wirklich wird aber auch 1,3 MByte an HTML-Material verarbeitet.
Die Methode gefällt mir zwar auf dem ersten Blick, doch wird damit wohl jedes noch denkbare " verarbeitet. Also doch wieder (leider) ungeeignet.

Trotzdem. Für kleinere Sachen viel leichter zu gebrauchen.


@Joghurt - zu Aufwendig extra das nachzuinstallieren, ich arbeite lieber mit den Standardkompanennten die von vornherein drin sind ;-)

@meandtheshell - lol - SED wird aber vielen Websites, wenn es um Reguäre Ausdrücke geht, emfohlen. - Deshalb versuche mich am liebsten damit.

Gruß

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

Beitrag von fuzzy » 09.06.2006 08:13:32

K.I.T.T. hat geschrieben: In wirklich wird aber auch 1,3 MByte an HTML-Material verarbeitet.
...je allgemeingültiger die Lösungen sein sollen, desto mehr Beispieinformationen sind hilfreich,
gerne auch in http://nopaste.debianforum.de/ :wink:

Code: Alles auswählen

echo '<a href="abc"></a><a href="cba"></a>' | tr " " "\n" | sed '/^href=/!d;s/.*"\(.*\)".*/\1/g'
abc
cba

Code: Alles auswählen

echo '<a href="abc"></a><a href="cba"></a>' | tr " " "\n" | awk -F '"' '/^href=/ {print$2}'
abc
cba
Gruß fuzzy

PS: hier z.Zt. unter FreeBSD geht sed'/ /\n/g' schief...

K.I.T.T.
Beiträge: 104
Registriert: 14.11.2005 11:33:38

Beitrag von K.I.T.T. » 09.06.2006 09:54:41

fuzzy hat geschrieben:
K.I.T.T. hat geschrieben: In wirklich wird aber auch 1,3 MByte an HTML-Material verarbeitet.
...je allgemeingültiger die Lösungen sein sollen, desto mehr Beispieinformationen sind hilfreich,
gerne auch in http://nopaste.debianforum.de/ :wink:
Würde ich die Quell-Datei hier veröffentlich, würde gegen einge Lizenzen verstoßen, die eine Reproduktion einfach nicht erlauben.

Und gerade in Foren muss man auf Urheberrechte auchten.
Siehe heise, desse C't seit der Aktion aus Protest nicht mehr erwerbe.

Gruß

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

Beitrag von fuzzy » 09.06.2006 15:58:14

K.I.T.T. hat geschrieben: Würde ich die Quell-Datei hier veröffentlich, würde gegen einge Lizenzen verstoßen, die eine Reproduktion einfach nicht erlauben.
Okay!
...eventuell gehen ja 10-30 Zeilen die Du anonymisiert hast,
um die "Suchbegriffe" besser anpassen/testen zu können. :wink:

Gruß fuzzy

Benutzeravatar
meandtheshell
Beiträge: 4054
Registriert: 14.01.2005 17:51:30

Beitrag von meandtheshell » 09.06.2006 16:21:54

K.I.T.T. hat geschrieben: @meandtheshell - lol - SED wird aber vielen Websites, wenn es um Reguäre Ausdrücke geht, emfohlen. - Deshalb versuche mich am liebsten damit.
Was haben reguläre Ausdrücke konkret mit Sed zu tun? Man kann sed mit regulären Ausdrücken füttern. Ich meinte die Aufgabenstellung an sich - für diese scheint mir Sed nicht der optimal Kandidat zu sein.

Viele Wege führen nach Rom. Besonders gut finde ich auch die von Joghurt aufgezeigte Python Variante. Python ist neben Perl sowieso eine sehr gute Wahl. Alles besser als PHP.

markus

Antworten