Máte na mysli vyhledat a nahradit řetězec ve všech souborech odpovídajících grep?
perl -p -i -e 's/oldstring/newstring/g' `grep -ril searchpattern *`
Upravit
Protože se zdá, že se jedná o poměrně populární otázku, myslel jsem, že bych ji aktualizoval.
V současné době většinou používám ack-grep
protože je uživatelsky přívětivější. Výše uvedený příkaz by tedy byl:
perl -p -i -e 's/old/new/g' `ack -l searchpattern`
Pro zpracování mezer v názvech souborů můžete spustit:
ack --print0 -l searchpattern | xargs -0 perl -p -i -e 's/old/new/g'
můžete udělat více s ack-grep
. Řekněme, že chcete omezit vyhledávání pouze na soubory HTML:
ack --print0 --html -l searchpattern | xargs -0 perl -p -i -e 's/old/new/g'
A pokud bílý prostor nepředstavuje problém, je ještě kratší:
perl -p -i -e 's/old/new/g' `ack -l --html searchpattern`
perl -p -i -e 's/old/new/g' `ack -f --html` # will match all html files
Zdá se, že toto je to, co chcete, na základě příkladu, který jste uvedli:
sed -i 's/foo/bar/g' *
Není rekurzivní (nebude sestupovat do podadresářů). Pro pěkné řešení nahrazení vybraných souborů ve stromu bych použil find:
find . -name '*.html' -print -exec sed -i.bak 's/foo/bar/g' {} \;
*.html
je výraz, kterému musí soubory odpovídat, .bak
za -i
vytvoří kopii původního souboru s příponou .bak (může to být jakákoli přípona, kterou chcete) a g
na konci výrazu sed říká sed, aby nahradil více kopií na jednom řádku (spíše než pouze první). -print
k nalezení je pohodlné ukázat, které soubory byly porovnávány. To vše závisí na přesných verzích těchto nástrojů ve vašem systému.