GNU Ache isso, mas não isso, e faça Sed?

3

Código

find /tmp/ -type f                                      \
    \( -name "*.h" \) -o \( -name "*.cpp" \) -o         \
    \( \! -name "*.bak" \) -exec                        \
    sed -i '1s/^/#include <stdint.h>\n/' {} +

Eu não estou completamente certo de que este é o caminho certo a seguir. Eu escrevo diretamente para o arquivo sem ter arquivos temporários. Eu quero substituir o início da linha em arquivos .h e .cpp com arquivos .bak , mas não em.

Como você pode fazer uma substituição eficiente? Nota: Estou usando o GNU sed .

Eu tentei o comando de Terdon e a inserção é aplicada a arquivos errados:

$ cat test.sh 
gfind /tmp/ -type f   \
    \( -name "*.h" -o -name "*.cpp" -o ! -name "*.bak" \) \
    -exec gsed -i '1s/^/#include <stdint.h>\n/' {} +    
$ sh test.sh 
$ cat test.sh    
#include <stdint.h>
gfind /tmp/ -type f   \
    \( -name "*.h" -o -name "*.cpp" -o ! -name "*.bak" \) \
    -exec gsed -i '1s/^/#include <stdint.h>\n/' {} +

onde todos os comandos são GNU: find e sed.

    
por Léo Léopold Hertz 준영 29.06.2015 / 13:47

1 resposta

7

Tente isto:

find /tmp/ -type f  -name "*.h" -o -name "*.cpp"  \
           -exec  sed -i '1s/^/#include <stdint.h>\n/' {} +

Além disso, como corretamente apontado para mim, o ! -name "*.bak" é supérfluo. O padrão -name *foo corresponde apenas aos arquivos que terminam com foo . Portanto, o *.cpp e o *.h já excluem *.bak .

    
por 29.06.2015 / 14:08

Tags