Removendo caracteres no final das linhas usando find e sed

Removendo caracteres no final das linhas usando find e sed

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 gseddesde 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 $fnos comandos echoe gsed.

Neste caso, felizmente, é fácil escrever um código que funcione de forma confiável: basta usar -execa 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 sedscript:

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

Responder2

Você pode querer apenas executar tudo isso dos2unixantes 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.

informação relacionada