Existe alguma maneira de executar uma pesquisa recursiva experimental e substituir usando sed
antes de executá-la? Eu só quero imprimir os resultados antes de fazer a pesquisa e substituir. Algo como ecoar os resultados de,
grep -rl term1 . |xargs sed -i -e 's/term1/term2/'
Respostas:
Você pode executar
sed
sem-i
e avançar pela saída comless
Em seguida, execute
sed
com-i.bak
para criar backups que você poderá diferenciar posteriormenteEditar: conforme sugerido no comentário, use
grep --null | xargs -0
. Isso faz com que os nomes de arquivos sejam finalizados pelo byte nulo, o que torna seguro para nomes de arquivos com caracteres incomuns, como nova linha. Sim,\n
é um caractere válido em um nome de arquivo unix. Os únicos caracteres proibidos são barra/
e o caractere nul\0
fonte
grep -rl --null
já que o OP não especificou o SO e-Z
significa algo diferente no BSD / OSX (descompactar).--null
é o mesmo no GNU e no BSDgrep
é (um fork) do GNU grep no FreeBSD e NetBSD. No NetBSD,-Z
ainda significa--null
(de acordo com a página de manual), mas eu concordo - null é mais portátil. Observe também que nem --null nem -Z funcionam no OpenBSDsed -i '' -e s/.../
no BSDsed
(sem opções opcionais lá)Use
sed
com emfind
vez degrep
Antes de tudo, eu empregaria,
find
e nãogrep
, e isso por três boas razões:find
permite a seleção de arquivos mais precisa. Por exemplo,grep -r string *.txt
produzirá arquivos apenas no diretório atual; não aqueles em subdiretórios.find
vem com a-exec
opção poderosa que elimina a necessidade de toda a--null … |xargs 0
construção.-readable
e evitarão perder tempo em arquivos que não podem ser acessados.-writable
find
Teste de captura
Dito isto,
grep
presta-se a um primeiro teste para ver o que seria capturado:ou mais especificamente:
Funcionamento a seco
Agora, prossiga com uma
sed
corrida a seco. Ased
opção-n
é um sinônimo--quiet
ep
no final dased
expressão imprimirá o espaço do padrão atual.ou mais especificamente:
Execução
Se tudo estiver bem, emita o comando definitivo substituindo a
sed
opção-n
por-i
"in place" e removendo op
no final.ou mais especificamente:
Mais
find
exemplosMais
find
exemplos podem ser encontrados aqui .fonte