Eu preciso fazer um regex localizar e substituir em todos os arquivos em uma pasta (e suas subpastas). Qual seria o comando do shell do linux para fazer isso?
Por exemplo, desejo executar isso em todos os arquivos e sobrescrever o arquivo antigo com o novo texto substituído.
sed 's/old text/new text/g'
Respostas:
Não há como fazer isso usando apenas o sed. Você precisará usar pelo menos o utilitário find junto:
Este comando criará um
.bak
arquivo para cada arquivo alterado.Notas:
-i
argumento para osed
comando é uma extensão GNU, então, se você estiver executando este comando com os BSDs,sed
você precisará redirecionar a saída para um novo arquivo e renomeá-lo.find
utilitário não implementa o-exec
argumento nas caixas UNIX antigas, portanto, você precisará usar um| xargs
.fonte
\;
?-i
por si só não cria um arquivo de backup, e é o que faz com que o sed execute a operação no arquivo no local.{}
?{}
será substituído por cada nome de arquivo encontrado porfind
e\;
informa para encontrar que o comando que ele precisa executar termina neste ponto.Prefiro usar
find | xargs cmd
overfind -exec
porque é mais fácil de lembrar.Este exemplo substitui globalmente "foo" por "bar" em arquivos .txt no diretório atual ou abaixo dele:
As opções
-print0
e-0
podem ser deixadas de fora se os nomes dos arquivos não contiverem caracteres engraçados, como espaços.fonte
find . -type f -name "*.txt" -print0 | xargs -0 sed -i '' "s/foo/bar/g"
(observe fornecendo uma string vazia para o-i
argumento).Para portabilidade, eu não confio em recursos do sed que são específicos para linux ou BSD. Em vez disso, uso o
overwrite
script do livro de Kernighan e Pike sobre o ambiente de programação Unix.O comando é então
E o
overwrite
script (que uso em todo lugar) éA ideia é que ele substitua um arquivo apenas se um comando for bem-sucedido. Útil em
find
e também onde você não gostaria de usarporque o shell trunca o arquivo antes de
sed
poder lê-lo.fonte
Posso sugerir (depois de fazer backup de seus arquivos):
fonte
Exemplo: replase {AutoStart} com 1 para todos os arquivos ini na pasta / app / config / e suas pastas filhas:
fonte
fonte
Pode querer tentar minha busca em massa / substituir script Perl . Tem algumas vantagens sobre as soluções de utilitário encadeado (como não ter que lidar com vários níveis de interpretação de metacaracteres shell).
fonte
Caso o nome dos arquivos na pasta tenha alguns nomes regulares (como arquivo1, arquivo2 ...) eu usei para o ciclo.
fonte