Nebo využít pro nahrazování jenom Perl:
#!/usr/bin/perl
while (glob('*.html')) {
open (SOURCE,$_) or die '$!\n';
print 'Zpracovávám soubor ','$_,'\n';
open (TARGET, ')$_.new') or die '$!\n';
while ((SOURCE)) {
chomp;
s/nejaky text/za nejaky text/g;
print TARGET $_,'\n';
};
close SOURCE;
close TARGET;
}
while (glob('*.new')) {
$old = $_;
s/\.new//;
rename $old,$_;
}
Mam k tomu clanku par poznamek:
A) zbytecne pouzivani perlu. stejne to lze udelat
i v shellu
for L in `find . -name *.html`;do sed -e '...';done
jedna radka a je to OK (u toho find jsou zpetny apostrofy)
a pokud to chcete jenom v aktualnim adresari,
tak staci pouze sed -e '...'
B) vetsina lidi asi pouziva Linux a obvykle RedHat
nevim jak jinde ale na RH je vi akorat link na vim
takze jestli ma vi a vim jiny regularni vyrazy, tak
to nebude fungovat, navic vim ma trosku odlisne
reg.vyrazy od perlu, takze pro perl se je ucte z
man perlre a pro vim se je ucte z helpu vimu
C) dalsi vec jsou priklady reg.vyrazu:
vyraz ma*ka v zadnem pripade (ani ve vimu ani v perlu)
nenajde slova matka, maska. totiz s reg.vyrazama je to
asi takhle:
. znak tecka zastupuje jakykoliv znak
* udava, ze se PREDCHOZI znak muze opakovat 0 a vickrat
+ udeva opakovani PREDCHOZIHO znaku 1 a vicekrat
? udava opakovani PREDCHOZIHO znaku 1 nebo 0 krat
{,n} predchozi znak se bude opakovat max. N-krat
{m,n} predch.znak se musi opakovat minimalne M-krat
a maximalne N-krat
{m,} znak se musi opakovat minimalne M-krat
{m} znak musi byt presne M-krat
pokud chcete opakovat posloupnost treba ABC,
tak se ta posloupnost uzavre do kulatych zavorek a
za zavorku se prida pocet, napr. (ABC){3,5} najde
posloupnost trojice ABC a to kdyz bude tahle trojice
za sebou trikrat az petkrat, cili
ABCABC ne
ABCABCABC jo
ABCABCABCABC jo
ABCABCABCABCABC jo
a delsi uz zase ne
pokud chcete nechat hledat znaky *,+,(,),/ atd.,
musite pred ne vlozit znak \, znak / se pouziva na
otevreni a uzavreni regularniho vyrazu, ale muzete misto
nej pouzit i jiny znak a pak muzete v reg.vyrazu pouzit
pouze znak / bez \. napr. pri hledani textu http://
je dobre pouzit vyraz
!http://! , kde zavorky reg.vyrazu bude znak vykricnik
je toho jeste vice, ale to by bylo opravdu na vlastni
clanek. Tohle totiz plati u PERLu,
VIM pouziva specialni znaky trosku jinak, napr.
co v PERLu znamena znak +, to se ve VIMu musi napsat
jako \+ atd. a take jeste zalezi na nastaveni
magic. Prostudujte skutecne man perlre, man grep,
man sed a help ve VIMu.
D) navic tenhle vyraz ma dve chyby:
g/HREF='http://www.domena.org/~uzivatel/adresar//s//HREF='/g
1) / nelze pouzit v reg.vyrazu, kdyz je / jako
zavorky reg.vyrazu. Musi se bud pouzit jine zavorky
nebo se pred znak / v reg.vyrazu musi zadat \
2) znak ~ ma ve vimu specialni vyznam, takze taky
potrebuje pred sebe znak \
E) pokud by nekdo chtel delat s vim a sed na MSDOS/WIN
tak muze, staci jit na adresy
ftp://ftp.vslib.cz/disk2/vim
a sed je v
ftp://ftp.zcu.cz/pub/simtelnet/gnu/djgpp/v2gnu/sed302b.zip
Zdravim
Wolf.
P.S.: Sorry za preklepy a pripadne chyby, ale melo
by to byt OK, ale nejsem regularni a VI guru:-)
takze chybicka se mozna vloudi
Tady to pokracuje!!!!
Tohle totiz plati u PERLu,
VIM pouziva specialni znaky trosku jinak, napr.
co v PERLu znamena znak +, to se ve VIMu musi napsat
jako \+ atd. a take jeste zalezi na nastaveni
magic. Prostudujte skutecne man perlre, man grep,
man sed a help ve VIMu.
D) navic tenhle vyraz ma dve chyby:
g/HREF='http://www.domena.org/~uzivatel/adresar//s//HREF='/g
1) / nelze pouzit v reg.vyrazu, kdyz je / jako
zavorky reg.vyrazu. Musi se bud pouzit jine zavorky
nebo se pred znak / v reg.vyrazu musi zadat \
2) znak ~ ma ve vimu specialni vyznam, takze taky
potrebuje pred sebe znak \
E) pokud by nekdo chtel delat s vim a sed na MSDOS/WIN
tak muze, staci jit na adresy
ftp://ftp.vslib.cz/disk2/vim
a sed je v
ftp://ftp.zcu.cz/pub/simtelnet/gnu/djgpp/v2gnu/sed302b.zip
Zdravim
Wolf.
P.S.: Sorry za preklepy a pripadne chyby, ale melo
by to byt OK, ale nejsem regularni a VI guru:-)
takze chybicka se mozna vloudi
A vloudila se chybicka:
V bode A) jsem chtel rict, ze pomoci sedu pouze v aktualnim adresari to jde pomoci prikazu
sed -e '...' *.html
kde ... je reg.vyraz neco jako
s!HREF='http;//www.server.org/\~uzivatel/!HREF='!gi
to g na konci znamena globalne-vickrat v jedne radce, coz se muze stat, ze na jedne radce bude vice odkazu
a to i znamena ignore-case, coz je dost dobre, protoze pokud nekdo zapise http misto HTTP, tak uz by to nas stary regularni vyraz nenasel
Wolf