Procura e substitui uma string em extensões de arquivo específicas

3

Eu tenho essa festa:

  replace="s/AAAA/BBBB/g";
  find myDirectory/. -type f -print0 | xargs -0 sed -i $replace;

que examinará recursivamente myDirectory tree e substituirá todas as ocorrências de AAAA por BBBB nos arquivos existentes.

Mas quero limitar isso a acontecer em arquivos de extensões específicas, por exemplo, .txt , .read , .po

Como faço para impor esse limite?

    
por SpaceDog 07.01.2013 / 02:19

3 respostas

9

Você pode usar a opção -name para encontrar para restringir as correspondências com base no nome do arquivo.

find myDirectory/. -type f -name '*.txt' -print0 | xargs -0 sed -i "$replace"

Para várias extensões, você pode usar -o (ou) e agrupá-las com () .

find myDirectory/. -type f \( -name '*.txt' -o -name '*.read' \) -print0 | xargs -0 sed -i "$replace"

Outra melhoria que pode ser feita é usar -exec em vez de xargs . Isso é mais portátil e elimina um subnível.

find myDirectory/. -type f -name '*.txt' -exec sed -i "$replace" {} +
    
por 07.01.2013 / 02:28
4

Adicione essas configurações ao seu .bashrc :

shopt -s extglob globstar

extglob ativa alguns padrões adicionais, incluindo o @(…) construct para disjunção. globstar ativa **/ , que percorre diretórios recursivamente.

Então você não precisa usar find :

sed -i "$replace" mydirectory/**/*.@(txt|read|po)

No zsh, você não precisa de nenhuma opção especial, apenas execute

sed -i $replace mydirectory/**/*.(txt|read|po)

Se você tiver muitos arquivos, poderá ver uma mensagem como "limite de comprimento da linha de comando excedido". Mas o limite é muito alto nos sistemas Linux modernos, é improvável que você o encontre.

    
por 08.01.2013 / 02:21
-1

Eu tentei isso com sucesso - para substituir a ocorrência de DBA com AOS

sed -i -E "s/DBA/AOS/g" *.sh
    
por 29.01.2018 / 16:20

Tags