GNU/Linux >> Znalost Linux >  >> Linux

Příkazový řádek:vyhledejte a nahraďte všechny názvy souborů odpovídající grep

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.


Linux
  1. Otestovat rekurzivní vyhledávání a výměnu Sed před spuštěním?

  2. Jak odstranit soubory a adresáře v příkazovém řádku Linuxu [Výukový program pro začátečníky]

  3. Jak nahradit všechny výskyty slova ve všech souborech v příkazovém řádku Linuxu

  1. Jak nahradit řetězec ve více souborech v příkazovém řádku linuxu

  2. Linux vyhledá slovo a zobrazí celý řádek

  3. Příkaz pro výpis všech souborů kromě . (tečka) a .. (tečka tečka)

  1. Jak odstranit soubory a adresáře v Linuxu z příkazového řádku

  2. Odstraňte soubory .DS_STORE v aktuální složce a všech podsložkách z příkazového řádku na Macu

  3. Jak přesunout všechny soubory a složky pomocí příkazu mv