Hlavní navigace

Jak na hromadné nahrazování textu? (2)

Leoš Literák

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

Našli jste v článku chybu?