Nahrazovßnφ textu II

24. 5. 1999on-line novΘ okno dom∙ p°edchozφ Φlßnek nßsledujφcφ Φlßnek

V minulΘm dφle jsem popsal skript na dßvkovou zm∞nu textu. Pou╛il jsem p°i tom perl, find a vi. V tomto Φlßnku ukß╛u dva dal╣φ zp∙soby, jak ud∞lat totΘ╛ jin²mi zp∙soby, p°iΦem╛ algoritmus Ondry SurΘho je nejefektivn∞j╣φ. Berte tyto t°i mo╛nosti jako d∙kaz flexibility unixu.

Prvnφ reakci jsem obdr╛el od Honzy Du╣ßka (omlouvßm se, jestli se mi nepovedl p°evod z cestiny do Φe╣tiny). Jeho skript pou╛φvß pouze kombinace perlu a find:

find . -name "*.html" -exec perl -i.bak -p -e "s/stare/nove/" {} ;

Co to d∞lß? Kdykoliv find najde soubor, kter² spl≥uje zadanß pravidla, spustφ perl ve specißlnφm modu. A ten pomocφ sv²ch internφch regulßrnφch v²raz∙ provede zßm∞nu. K tomuto skriptu bych m∞l v²hradu, ╛e se p°i ka╛dΘm nalezenφ souboru spou╣tφ perl, co╛ je intepret. A ne zrovna mal². Navφc kdysi jsem psal n∞jakou aplikaci v perlu a rychlost vnit°nφch regulßrnφch v²raz∙ m∞ zklamala. Ale to se mohlo mezitφm zm∞nit.

Dal╣φ dopis mi napsal Ondra Sur². Ten m∞l v²hrady k volb∞ program∙ (eufemicky °eΦeno). Mφsto nich navrhl pou╛φt sed a shell.

#!/bin/sh
for $file in `find . -name "*.html"`; do
  echo -n "Zpracovßvßm soubor $file";
  mv $file $file.bak;
  cat $file.bak | sed -e "s/XYZ/ABC/" > $file
  echo -n "hotovo."
done

Tento skript je ve svΘ podob∞ velmi podobn² mΘmu p∙vodnφmu °e╣enφ. Mφsto perlu ale pou╛φvß shell (rychlej╣φ start, zabφrß mΘn∞ pam∞ti) a mφsto vi program sed (rychlej╣φ b∞h, mΘn∞ pou╛itΘ pam∞ti).

JednoΦlennß komise ve slo╛enφ Leo╣ Literßk se jednomysln∞ shodla, ╛e vφt∞zem se stal Ondra Sur². Jeho °e╣enφ je nejefektivn∞j╣φ a nejp°ehledn∞j╣φ (a jß se po veΦerech budu uΦit programovat v shellu).

Tak m∞ napadß, co ud∞lat men╣φ sout∞╛. Po╣lete mi svΘ skripty, jß je porovnßm, otestuji a v²sledky zve°ejnφm. Skript mß

  1. provßd∞t automatickou v²m∞nu textu ve v╣ech souborech spl≥ujφcφch danou podmφnku
  2. b²t p°ehledn² a snadno pou╛iteln²
  3. b²t vhodn² i pro zaΦßteΦnφky bez znalostφ jednotliv²ch program∙
  4. b²t rychl²
Uzßv∞rka je v pßtek 4.6.1999. SvΘ p°φsp∞vky posφlejte na adresu literakl@seznam.cz.

Leo╣ Literßk
Linux Hardware

Autor: Leo╣ Literßk (jinΘ Φlßnky tohoto autora)
Sekce: Praxe
Souvisejφcφ Φlßnky:


Diskuse

25. 5. 1999 21:16:07 - K uveden²m p°φklad∙m a hlavn∞ ... (Ji°φ Svato≥)
K uveden²m p°φklad∙m a hlavn∞ potom k vyhlß╣enΘ sout∞╛i mßm jednu p°ipomφnku. Dokud byl uveden jenom prvnφ p°φklad, bral jsem to jako jednoduchou ukßzku, kterß sice leccos opomn∞la, ale pro demonstraΦnφ ·Φely staΦφ. Ale vyhlß╣enφm sout∞╛e se situace pon∞kud m∞nφ. Tady by uz m∞lo jφt o skuteΦn∞ pou╛iteln² script. ProblΘm je v tom, ╛e script je sice ve v╣ech ukßzkßch deklarovßn pro pou╛itφ na html souborech, ale pomφjφ zßkladnφ vlastnost HTML, tedy ╛e odd∞lovaΦem m∙╛e b²t jakΘkoliv bφlΘ mφsto vΦetn∞ NOV╔HO ╪┴DKU. A p°itom varianta s vi i se sed (a myslφm, ╛e i ta s perlem) pracujφ °ßdkov∞, tedy naΦtou ze vstupu JEDNU ╪┴DKU a nad nφ provedou nßhradu. I kdy╛ pou╛iji jako nahrazovan² vzor regulßrnφ v²raz, ve kterΘm mφsto v╣ech mezer uvedu 'nejmΘn∞ jedno bφlΘ mφsto', zpracuje mi to sice sprßvn∞ podobu <a(mezera)href, <a(mezera)(mezera)href a pod., ale sel╛e to na <a(novß °ßdka)href :-( Narazil jsem na to te∩, kdy╛ se sna╛φm na serveru s mnoha sty strßnkami nahradit n∞kolika°ßdkov² star² k≤d Mr.Lin(x)e nov²m (navφc nevφm, jak mi ho za tu dobu r∙znΘ editory p°i zalamovßnφ p°eformßtovaly)...

26. 5. 1999 10:43:28 - Re: K uveden²m p°φklad∙m a hlavn∞ ... (Leos literak)
K prikladu s (A href='sdfsd'): Toto se da vyresit jednoduse zmenou regularniho vyrazu na s/href='sdfsd' -) takto se vezme jen odkaz a nove radky mezi (a a href nejsou problem.

6. 6. 1999 23:57:43 - Re: K uveden²m p°φklad∙m a hlavn∞ ... (Ji°φ Svato≥)
Te∩ pon∞kud uh²bßte. Ten p°φklad s (a href=) jsem zvolil jenom pro jednoduchost. Jak jsem uz psal, jde mi obecn∞ o vφce°ßdkovΘ nßhrady, p°esn∞ji o nßhrady, kde konec °ßdku nehraje roli (stejn∞ jako v HTML k≤du). Mimochodem, jß v tom mΘm textu nikde nepsal, ze v tom (a href=) chci m∞nit jenom obsah toho href, co kdy╛ jsem cht∞l mφsto celΘho tagu (a href=) dßt n∞co jinΘho (t°eba SSI sekvenci, nebo javascript, kterΘ ho vygenerujφ) :-) A na konci jsem ·pln∞ konkrΘtn∞ psal, ╛e jsem na to narazil p°i v²m∞n∞ k≤du Mr.Lin(x)e a to je (pokud jej neznßte) nßhrada starΘho cca p∞ti°ßdkovΘho javascriptu za nov² asi osmi°ßdkov²...


on-line novΘ okno dom∙ p°edchozφ Φlßnek nßsledujφcφ Φlßnek