Melhor maneira de percorrer um monte de arquivos e procurar / substituir texto?

1

Estou com problemas para fazer algo que deve ser bastante simples. Aqui está como eu imagino que funcionaria:

find . -name *.txt -exec sed 's/oldtext/newtext/g' {} > tmp \; mv tmp {} \;

Infelizmente, não consigo sedinar um arquivo e despejo para si mesmo. Mas eu não consigo descobrir como despejar em um arquivo temporário e, em seguida, imediatamente mv esse arquivo. Eu sei \\; está errado, mas não consigo descobrir como executar um comando seguido pelo outro.

    
por CaptSaltyJack 21.04.2011 / 22:28

2 respostas

0

Veja a opção -i em man sed .

-i[SUFFIX], --in-place[=SUFFIX]

edit files in place (makes backup if extension supplied)

Menos útil, mas relacionado, você também pode vincular vários -exec s juntos; eles são executados da esquerda para a direita.

tmp=$(tempfile)
find . -name '*.txt' -exec sed 's/oldtext/newtext/g' '{}' > $tmp \; -exec mv $tmp '{}' \;

(Observe a citação de *.txt , {} e o escape de ; para não tê-los interpretados pelo seu shell.)

    
por 21.04.2011 / 23:06
0

Você pode usar o Vim no modo Ex:

find -name '*.txt' -exec ex -sc '%s/OLD/NEW/g|x' {} ';'
  1. % seleciona todas as linhas

  2. s substituto

  3. g global replace

  4. x salvar e fechar

por 17.04.2016 / 00:48

Tags