Teste a busca sed recursiva e substitua antes de executar

12

Existe alguma maneira de executar uma pesquisa recursiva de teste e substituir usando sed antes de executá-la? Eu só quero imprimir os resultados antes de realmente fazer a pesquisa e substituir. Algo como ecoando os resultados de,

grep -rl term1 . |xargs sed -i -e 's/term1/term2/'
    
por user251482 05.02.2014 / 21:31

2 respostas

10

Você pode executar sed sem -i e passar pela saída com less

grep -rl --null term1 . | xargs -0 sed -e 's/term1/term2/' | less

Em seguida, execute sed com -i.bak para criar backups que você possa diferenciar posteriormente

grep -rl --null term1 . | xargs -0 sed -i.bak -e 's/term1/term2/'
diff somefile.bak somefile
# verify changes were correct

Editar: Como sugerido no comentário, use grep --null | xargs -0 . Isso faz com que os nomes de arquivos sejam finalizados pelo byte nulo, o que o 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 %code%

    
por 05.02.2014 / 21:35
4

Use find em vez de grep

Antes de mais nada, eu utilizaria find em vez de grep , e isso por três boas razões:

  1. find permite uma seleção de arquivos mais precisa. Por exemplo, grep -r string *.txt produzirá arquivos apenas no diretório atual; não com aqueles em subdiretórios.
  2. find vem com a poderosa opção -exec , que elimina a necessidade de toda a construção --null … |xargs 0 .
  3. As opções -readable e -writable de find evitam perder tempo com arquivos que não podem ser acessados.

Teste de captura

Dito isso, grep se presta para um primeiro teste para ver o que seria capturado:

$ find . -exec grep term1 {} \;

ou mais especificamente:

$ find . -type f -name '*.txt' -readable -writable -exec grep term1 {} \;

Corrida a seco

Agora, prossiga com uma execução de sed . O sed option -n é um sinônimo para --quiet e o p no final da expressão sed imprimirá o espaço padrão atual.

$ find . -exec sed -n 's/term1/term2/gp' {} \;

ou mais especificamente:

$ find . -type f -name '*.txt' -readable -writable -exec sed -n 's/term1/term2/gp' {} \;

Execução

Se tudo estiver correto, emita o comando definitivo substituindo sed option -n por -i por "in place" e removendo p no final.

$ find . -exec sed -i 's/term1/term2/g' {} \;

ou mais especificamente:

$ find . -type f -name '*.txt' -readable -writable -exec sed -i 's/term1/term2/g' {} \;

Mais find exemplos

Mais find exemplos podem ser encontrados aqui .

    
por 04.10.2017 / 14:28

Tags