[linux-l] Tool fuer Paragraphen

Mike Dornberger Mike.Dornberger at gmx.de
Mi Dez 26 09:24:31 CET 2007


Hi,

On Sat, Dec 22, 2007 at 12:11:15PM +0100, Ivan F. Villanueva B. wrote:
> Jetzt frage ich mich, mit welchen Tools solche Sachen zu bearbeiten sind.
> Ich möchte nur die URLs haben, die nicht "Valid" sind.
> Mit Vim scheint mir etwas umständlich: :%s/^URL\s`\(.*\)' ...
> Was soll ich lernen, um solche Sachen effektiv zu machen?
> awk? sed?

falls vim keine Probleme damit hat, \n (bzw. ^M) in :s zu verarbeiten, geht
es vermutlich. Ich würde ein Makro zusammenstricken, welches zuerst alle
Paragraphen löscht, die nicht "Result Valid" enthalten (und evt. sogar alle,
die Result gar nicht enthalten, je nachdem; könnte evt. funktionieren, wenn
man sowas wie \(...^M\)^M\+ als regex nimmt) und dann in einem zweiten
Schritt alle Zeilen löschen, die nicht mit URL anfangen.

Die bisherigen Vorschläge, sich einfach die URL zu merken und dann
auszugeben, wenn "Result Error" kommt, funktionieren aber auch nur
zuverlässig, wenn das Programm aus dem man die Eingabe pipe-t, auch
garantiert, immer eine URL-Zeile auszugeben. Mal als Gegenbeispiel:

...
URL a_valid_url
Result Valid

corrupted href attribute in input line 123...
Result Error
...

würde dann die falsche URL ausgeben.

Ich hab mal ein wenig mit perl rumgespielt (siehe Anhang) und die
Paragraphen als Felder betrachtet und eine Lösung gefunden, die einem sogar
leere Paragraphen liefert, falls z. B. der Feldtrenner (field separator)
genau \n sein soll oder falls '\n+', einem leeren Paragraphen am Anfang und
Ende des Inputs melden kann. Als Anwendungsbeispiel für "genau \n" fiele mir
z. B. eine for-Schleife ein, die ein Programm auf verschiedene Dateien
aufruft und das Programm nur im Fehler- oder Warnfall etwas ausgibt, man
aber immer nach jedem Programm-Aufruf ein \n ausgibt. (Gut, sinnvollerweise
würde man immer den Dateinamen in so einer Schleife ausgeben, aber mal
angenommen, die for-Schleife sei in einem Programm, was man nicht ändern
kann, oder jemand schickt einem halt eine Datei, die so formatiert ist.)

Ich hab das in perl zweimal geschrieben, einmal, indem man die gesamte Datei
in einem Rutsch in den Speicher liest ("slurp mode") und einmal, indem man
zeilenweise liest. Falls man das mit den leeren Paragraphen am Anfang und am
Ende nicht braucht, vereinfacht sich einiges. In der regex für split kann
man dann das (?:^|(?<=\n)) gegen (?<=\n) ersetzen und das ', -1' im
split-Aufruf weglassen (siehe perldoc -f split), ggf. Leerzeilen am Anfang
dann mittels $para =~ s/^\n+//s löschen, und im Zeilenweise-Beispiel wird
evt. so gut wie alles wegfallen, wenn man perls Record Separator $/ auf ""
oder "\n\n" setzt und einfach eine normale while (<TEXT>){} - Schleife
benutzt (siehe perldoc perlvar).

Gruß,
 Mike
-------------- nächster Teil --------------


a paragraph
if parasep is exactly one LF, then we have two empty paragraphs above this one
(else one empty above)

URL        `/Berliner_Buero' (cached)
Name       `Berliner Büro'
Parent URL http://www.ffii.de/index.html, line 24, col 5
Real URL   http://www.ffii.de/Berliner_Buero
Info       Redirected to http://www.ffii.de/Berliner_Buero/.
Warning    HTTP 301 (moved permanent) encountered: you should
           update this link.
Result     Valid: 200 OK

URL        `http://www.ffii.org.uk/' (cached)
Name       `Großbritannien'
Parent URL http://www.ffii.de/Berliner_Buero/, line 89, col 13
Real URL   http://www.ffii.org.uk/
Result     Error: (111, 'Connection refused')

another paragraph



yet another one
if parasep is exactly one LF, then we have two empty paragraphs above this one
and two empty below (else only one empty below)


-------------- nächster Teil --------------
Ein Dateianhang mit Binärdaten wurde abgetrennt...
Dateiname   : paratest.pl
Dateityp    : text/x-perl
Dateigröße  : 2175 bytes
Beschreibung: nicht verfügbar
URL         : <https://mlists.in-berlin.de/pipermail/linux-l-mlists.in-berlin.de/attachments/20071226/bcbd339c/attachment.pl>


Mehr Informationen über die Mailingliste linux-l