Você pode usar o find para encontrar os arquivos de destino e enviá-los para o sed:
find | xargs sed -i 's/foo/bar/g'
Substitua apenas arquivos .txt:
find . -name "*.txt" -print | xargs sed -i 's/foo/bar/g'
(de esta postagem no blog )
aqui é uma situação prática.Eu enfrento alguns dos meus arquivos, onde há uma string comum nesses arquivos.Eu costumo abrir o vi e fazer alguma coisa como
:%s/text/replacement/g
e eu tenho que fazer isso em muitos arquivos muitas e muitas vezes. Existe alguma maneira fácil de fazer isso ou algum tipo de apelido que eu possa criar para o mesmo?
Você pode usar o find para encontrar os arquivos de destino e enviá-los para o sed:
find | xargs sed -i 's/foo/bar/g'
Substitua apenas arquivos .txt:
find . -name "*.txt" -print | xargs sed -i 's/foo/bar/g'
(de esta postagem no blog )
Ah sim, hora de um perlineriner. Que tal isso?
perl -pi -e 's/old text/new text/' file
ou talvez você queira alterar todos os arquivos * .txt no diretório atual? Nesse caso, que tal combiná-lo com o paralelo GNU :
parallel perl -i.bak -pe 's/foo/bar/' ::: *.txt
Com o paralelo, o :::
significa que usam o eveything após isso como arquivos de entrada .
ou, para alterar all os arquivos txt no diretório atual e abaixo :
find . -name \*txt -print0 | parallel -q -0 perl -i.bak -pe 's/old text/new text/'
Observe que -i.bak
salva uma cópia de backup de todos os arquivos que você altera, no caso de cometer um erro. Você pode deixar isso de lado se estiver se sentindo perigoso.
De qualquer forma, obviamente, a resposta sed
é a padrão, mas existem algumas formas alternativas divertidas de fazer isso também. Além disso, se você tiver muitos arquivos, o gnu parallel será significativamente mais rápido, já que executa várias cópias em paralelo (como seria de esperar, dado o nome).
Confira sed, algo assim:
sed -i 's/text/replacement/g' file