apró shell script

Sziasztok

tudna nekem mondani valaki egy olyna kis scriptet amivel egy mappában lévő összes fájlban kicserél egy stringet egy másikra.

pl ha a fájlokban ahárhol szerepel hogy kelkáposztafőzelék és a scriptbe azt írom hogy a káposztát cserélje bimbóra akkor minden fájlban kelbibmófőzelék legyek

Köszi szépen

Hozzászólások

man bash
man sed
man 7 regex

bashból a filenév glob kell neked
a for ciklus

sedből az s/// parancs

de ha nem szeretnél okosdni, csak a megoldás kell:


mit="qqriq";mire=torokcsaszar; for file in *  do; \
  sed "s/$mit/$mire/g" ; \
done

---
Reactor error - core dumped!

Azért igazán kipróbálhattad volna, már csak mert erre így csak egykori tanáromat tudnám idézni, miszerint "kolléga, ez még nem gól, csak kapufa". Valószínűleg erre gondoltál:

mit=qqriq
mire=torokcsaszar
for file in *;
do
  sed -i "s/$mit/$mire/g" $file;
done

Azaz pl. a sed-nek érdemes megmondani, hogy milyen file-on is kell dolgoznia, illetőleg a -i sem árt, már csak hogy ne az stdout-ra írja az eredményt, és ez még mindig érdekes eredményt adna, ha a cserélendő ill. behelyettesítendő szövegben van dollár-, per-, és-, felkiáltójel...
Amúgy ha nem kell rekurzív módon cserélni, akkor inkább ezt javasolnám:

sed -i 's/qqriq/torokcsaszar/g' *

ha pedig rekurzíve is kell, akkor:

find . -type f -exec sed -i 's/qqriq/torokcsaszar/g' {} \;

egyfelől igazadvan, de miért próbáljak ki bármit is, ha nekem nincs rá szükségem, neki van. majd legalább elolvassa a manpédzset, úh. gyorsan rontsad el te is a hozzászólásodban :)

és ahogy tanáraim mondanák: csak ellenőriztem, hogy figyel-e!
---
Reactor error - core dumped!

Nem kell ide sed, tudja ezt a bash maga:


find . -type f|while read x;
 do mv "$x" "${x//kaposzta/bimbo}"; 
done

Ha a kapcsoszárójelen belül a //-t /-re cseréled, akkor csak az első előfordulást cseréli, így mindet.

Üdv!
________________________________________________
Debian 4.0 - linux-2.6.21-smp-cfs - KDE 3.5.5

find + perl

perl -pi -e 's/foo/bar'

t