
Para uma base de código convertida de java para scala, existem 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: usar gsed
desde no mac sed
é lixo ..)
No entanto, isso simplesmente não funciona - 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
faztrabalhar.
Responder1
Nunca use isso:
for f in $(find . -name \*.scala); do echo $f; gsed -i $f -e "s/\x0D$//"; done
Isso funcionaatévocê tem um arquivo cujo nome contém espaços em branco ou outros caracteres ativos no shell. Por um lado, o shell executará ambosdivisão de palavraseexpansão do nome do caminhona saída de $(find . -name \*.scala)
. Mesmo sem isso, o shell funcionarádivisão de palavras eexpansão do nome do caminhonas ocorrências não citadas $f
nos comandos echo
e gsed
.
Neste caso, felizmente, é fácil escrever um código que funcione de forma confiável: basta usar -exec
a opção find:
find . -name \*.scala -print -exec gsed -i -e 's/\x0D$//g' {} +
Se você quiser remover o ponto-e-vírgula ao mesmo tempo, basta adicionar mais um comando de substituição ao sed
script:
find . -name \*.scala -print -exec gsed -i -e 's/\x0D$//g; s/;$//;' {} +
Responder2
Você pode querer apenas executar tudo isso dos2unix
antes de executar o sed. Como obter o dos2unix, você pode perguntar? Bem, este é o principal motivo para adicionar outra resposta aqui (e porque ainda não tenho representante suficiente para adicionar comentários). Se você quiser sobreviver ao OSX, você precisa doGerenciador de pacotes Homebrew. A primeira coisa depois de instalar o Homebrew (2 minutos) éatualize o bash!! OSX não atualiza o bash há 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. Realmente. OSX sem Homebrew é como Windows sem Cygwin. Bem, na verdade não; mas você entendeu.
Responder3
Eu descobri o motivo: os arquivos continham ^M
(estilo DOS CRLF
) - então primeiro eu tive que fazer:
for f in $(find . -name \*.scala); do echo $f; gsed -i $f -e "s/\x0D$//"; done
Posteriormente, o comando mostrado no OP funciona bem.