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?
24. 3. 2009 23:17
Jo, taky bych chtěl dělat v sedu víceřádkové náhrady, ale nemůžu se dobrat, jak na to. Stačilo by prostě dát celý soubor do pattern space a bylo by... kdyby to sed uměl. (zdá se, že neumí)
6. 6. 1999 23:57
Jiří Svatoň (neregistrovaný)

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 …