[X-Post & F'up2 de.comp.os.unix.shell; <
http://www.liesmal.de/fup2-faq>]
Christoph Federer wrote in de.comp.os.unix.apps.misc:
> Frank Graf schrieb:
>> Am Tue, 16 Apr 2013 23:40:48 +0200 schrieb Richard llom:
>> [...]
>>> Hier habe ich aber noch ein paar Probleme.
>>> Der relevante Quelltext sieht so aus:
>>> ...
>>> //addVar("file","URL");
>>> addVar("file","URL");
>>> ..
>>> mit grep addVar\(\"file\",\".*\" seiten.html > downloads.txt bekomme ich
>>> aber immer nur die kompletten Zeilen?
>>
>> grep gibt immer ganze Zeilen aus. Mit dem Tool awk sollte das Problem
>> lösbar sein.
>
> Das stimmt so nicht. Mit dem Parameter -o wird nur der Teil ausgegeben,
> auf den das Pattern passt.
ACK.
>>> Außerdem wie muss ich die regExp verändern um den auskommentierten Teil
>>> (//...) auszuschließen? (übrigens der Grund warum meine bisherige Lösung
>>> nicht mehr funktioniert)
> Am einfachsten ist wohl eine Kaskade von grep und sed:
> grep -o /*addVar\(\"file\",\".*\"\) seiten.html|
> grep -v //addVar|
> grep -o \,\".*\"|
> sed -e s/\,\"//g -e s/\"//g |
> while read line; do wget $line; done
>
> Zeile 1 siebt kommentierte und nicht kommentierte Statements heraus, Zeile
> 2 filtert die kommentierten raus, Zeile 3 extrahiert den URL, Z4 löscht
> noch störende Zeichen und Z5 verfüttert das ganze zum Schluss direkt an
> wget.
Das ist
0. fhcsal, denn Anweisungen funktionieren nicht mit einer *beliebigen*
Anzahl führender “/”;
1. ineffizient, denn
a. viele Escape-Sequenzen sind überflüssig;
b. Kommentarzeilen lassen sich von vornherein ausschliessen;
c. sed(1) kann die Filterung selbst;
d. wget(1) kann die zeilenweise Verarbeitung selbst;
2. fehlerträchtig, weil Du davon ausgehst, dass
a. in jeder Zeile nur eine Anweisung steht, dem kein Kommentar folgt;
b. „addVar“ unmittelbar auf den Kommentar folgen muss;
c. ein Kommentar immer „addVar“ enthalten muss;
d. „"“ unmittelbar auf das Komma folgen muss;
e. der Programmierer immer einen nicht-leeren Wert angegeben hat;
f. der Programmierer nicht vergessen hat, Leerzeichen zu maskieren;
g. kein „\“ enthalten ist, der “read” durcheinanderbringen könnte.
zu 0, 1a, 1b, 1d, und 2b bis 2g:
grep -o '^[[:space:]]*addVar[[:space:]]*([[:space:]]*"file"[[:space:]]*,\
[[:space:]]*"[^"]\{1,\}"[[:space:]]*)' seiten.html |
grep -o ',[[:space:]]*"[^ "]\{1,\}"' |
sed -e 's/,"//g; s/"//g' |
wget -i -
zu 1c:
expr='^[[:space:]]*addVar[[:space:]]*([[:space:]]*"file"[[:space:]]*,\
[[:space:]]*"\([^"]\{1,\}\)"[[:space:]]*)[[:space]]*;'
sed -ne "$expr { s/$expr/\\1/; p }" seiten.html | \
wget -i -
Etwas schöner geht es natürlich mit GNU sed –
expr='^[[:space:]]*addVar[[:space:]]*([[:space:]]*"file"[[:space:]]*,\
[[:space:]]*"\(\([^"\\]\|\\.\)+\)"[[:space:]]*)[[:space]]*;'
sed -nre "/$expr/ { s/$expr/\\1/; p }" seiten.html \
wget -i -
– und deutlich schöner mit Perl:
perl -ne '
m{^\s*addVar\s*\(\s*"file"\s*,\s*"((?:[^\\"]|\\.)+)"\s*\)\s*;} &&
print $1 . "\n";' < seiten.html |
wget -i -
Bitte nur das Wesentliche zitieren:
<
http://lernst.de/zitieren/kriegst.de/antworten>