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.

Doba čtení: 1 minuta

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?