Procura e substitui em vários arquivos com base na condição

3

Estou portando um projeto do Visual Studio C ++ para o Linux e gostaria de encontrar todas as linhas em todos os arquivos .h e .cpp que começam com #include e em qualquer uma dessas linhas gostaria de substituir a barra invertida pela barra .

Existem alguns scripts sobre como pesquisar e substituir on-line (usando perl ou sed, por exemplo), mas nenhum com uma condição.

Qual é o melhor caminho?

Obrigado

    
por Cookie 31.05.2011 / 12:49

1 resposta

3

No sed, você pode colocar um regexp (entre /…/ ) antes do comando s para executar apenas a substituição nas linhas que contêm esse regexp. A opção -i para modificar arquivos no lugar é específica para o GNU sed (que é o que você tem no Linux e no Cygwin).

sed -i -e '/^ *# *include/ s!\\!/!g' **/*.h **/*.cpp

Em Perl, basta colocar uma condição antes de fazer a substituição.

perl -i -pe 'if (/^\s*#\s*include/) {s!\\!/!g}' **/*.h **/*.cpp
perl -i -pe '/^\s*#\s*include/ and s!\\!/!g' **/*.h **/*.cpp

A sintaxe **/ para corresponder arquivos no diretório atual e seus subdiretórios recursivamente requer zsh, ou bash ≥4 depois de fazer shopt -s globstar . Com outros shells, você precisa usar o find.

find \( -name '*.h' -o -name '*.cpp' \) -exec perl -i -pe '…' {} +
    
por 31.05.2011 / 13:41