Altere as ocorrências de string no arquivo, respeitando as novas seqüências de linha do DOS

3

Eu uso o Visual Studio para meu desenvolvimento em C # enquanto uso o Cygwin para algumas das tarefas que requerem scripts. Recentemente eu quis mudar todas as ocorrências da string AAA para BBB nos arquivos do meu projeto. Comecei com o antigo e confiável sed , mas, para meu espanto, ele mudou as novas sequências de linha do DOS para as do Unix.

Veja o que eu usei:

sed -i 's/AAA/BBB/g' $(grep -rl AAA /cygdrive/c/project_path)

Parece que não há uma chave sed que faça o que eu quero. Existe alguma outra ferramenta Unix que possa me ajudar?

EDITAR: Entre os arquivos C # existem alguns outros scripts que possuem novos caracteres de linha do Unix. Seria melhor se essa ferramenta não os alterasse para os do DOS. :)

    
por mczers 20.06.2012 / 13:39

2 respostas

1

Deve haver uma função incorporada para isso no VS.

Se não, você pode usar o bom e velho vi :

vi +'bufdo %s/AAA/BBB/g | update' +q $(grep -rl AAA /cygdrive/c/project_path)
    
por 20.06.2012 / 14:51
1

Você pode usar o perl do Cygwin. Comandos sed típicos mapeiam facilmente para Perl. Observe que a sintaxe regex é diferente (expressões regulares estendidas em Perl, expressões regulares básicas em sed).

perl -i -pe 's/AAA/BBB/g' $(grep -rl AAA /cygdrive/c/project_path)

Observe que analisar o resultado de uma substituição de comando como uma lista de arquivos é frágil. Ele irá quebrar se houver espaços ou barras invertidas nos nomes dos arquivos; ambos são bastante comuns no Windows (você recebe barras invertidas quando um caminho não foi traduzido do nativo para o cygwin, por exemplo, quando ele vem de uma variável de ambiente). Use xargs -d '\n' (não há novas linhas nos nomes de arquivos do Windows).

grep -rl AAA /cygdrive/c/project_path | xargs -d '\n' perl -i -pe 's/AAA/BBB/g'
    
por 21.06.2012 / 00:46