Removendo caracteres no final das linhas usando find e sed

2

Para uma base de código convertida de java para scala, há muitos arquivos com ponto e vírgula desnecessários no final. Aqui está minha tentativa de removê-los:

for f in  $(find . -name \*.scala); do echo $f; gsed -i $f -e "s/;$//g"; done

(Nota: usando gsed desde que no mac o sed é lixo ..)

No entanto, isso simplesmente não está fazendo o trabalho - os pontos-e-vírgulas não são removidos.

Observe que a execução em um único arquivo como:

for f in  $(find . -name testfile); do echo $f; gsed -i $f -e "s/;$//g"; done

funciona .

    
por javadba 11.06.2016 / 06:08

3 respostas

1

Nunca use isso:

for f in  $(find . -name \*.scala); do echo $f; gsed -i $f -e "s/\x0D$//"; done

Isso funciona até que você tenha um arquivo cujo nome tenha espaços em branco ou outros caracteres ativos em shell. Por um lado, o shell executará tanto divisão de palavras como expansão de nome de caminho na saída de $(find . -name \*.scala) . Mesmo sem isso, o shell executará divisão de palavras e expansão de nome de caminho nas ocorrências sem aspas de $f nos comandos echo e gsed .

Neste caso, felizmente, é fácil escrever código que funcione de maneira confiável: use a opção -exec do find:

find . -name \*.scala -print -exec gsed -i -e 's/\x0D$//g' {} +

Se você quiser remover os pontos-e-vírgulas à direita ao mesmo tempo, basta adicionar mais um comando de substituição ao script sed :

find . -name \*.scala -print -exec gsed -i -e 's/\x0D$//g; s/;$//;' {} +
    
por 12.06.2016 / 22:57
1

Você pode querer executar todos esses recursos em dos2unix antes de executar o sed. Como obter dos2unix você pode perguntar? Bem, esta é a principal razão para adicionar outra resposta aqui (e porque eu não tenho representante suficiente para adicionar comentários ainda). Se você quiser sobreviver ao OSX, você precisa do gerenciador de pacotes Homebrew . A primeira coisa depois de instalar o Homebrew (2 minutos) é atualizar o bash !! OSX não atualizou bash em anos. Com isso você pode atualizar os utilitários unix.

Caso você tenha tido experiências ruins com MacPorts e Fink no passado, o Homebrew não é assim. Mesmo. OSX sem Homebrew é como o Windows sem o Cygwin. Bem, na verdade não; mas você tem a ideia.

    
por 11.06.2016 / 06:51
0

Eu encontrei o motivo: os arquivos tinham ^M (estilo DOS CRLF ) neles - então primeiro eu tive que fazer:

for f in  $(find . -name \*.scala); do echo $f; gsed -i $f -e "s/\x0D$//"; done

Em seguida, o comando mostrado no OP funciona bem.

    
por 11.06.2016 / 06:34

Tags