Como substituir todas as guias em cada arquivo em uma ramificação do sistema de arquivos com 2 espaços cada?

10

Eu codifico Scala e sua convenção é usar espaços duplos por nível para identificação. Mas o uso de editores diferentes torna minhas fontes preenchidas com uma mistura de espaços e guias.

Eu gostaria de refatorar todos os arquivos (arquivos * .scala, na verdade, mas especificar isso não é necessário) (em um determinado diretório e em todo o ramo FS subjacente (recursivamente)) automaticamente, substituindo todas as guias por espaços duplos. Acredito que exista uma maneira fácil e bonita de fazer isso com as ferramentas clássicas do Unix / GNU, mas não tenho nenhuma experiência nessa área. Você seria tão gentil em me ajudar?

Ivan
fonte

Respostas:

9

Recursivamente, usando expand(que foi feito para essa finalidade):find . -type f -name '*.scala' -exec bash -c 'for x in "$@"; do mv "$x"{,.bak} && expand -t 2 "$x.bak" > "$x" && rm "$x.bak"; done' {} +

Eu faria isso com sedou perl(veja a resposta de Sardathrion) porque eles suportam a edição em linha, mas eu queria mencionar o bom e velho de expandqualquer maneira.

EDIT: Isso seria find . -type f -name '*.scala' -exec perl -p -i -e $'s/\t/ /g' {} +

janmoesen
fonte
A primeira variante funciona conforme o esperado. A segunda variante (perl) substitui uma guia por apenas um espaço em vez de dois.
26411 Ivan
Sim, desculpe: esse foi um erro de formatação. O código fonte diz dois espaços, mas o HTML renderizado mostra apenas um.
23411 Janmoesen
10

Isso deve servir:

find . -type f -name '*.scala$' -exec sed -i 's/\t/  /g' {} +

Nota: isso não é testado.

Sardathrion - contra o abuso de SE
fonte
1
Isso ainda não é recursivo. Você pode usar findou um shell que suporte **/*.scalarecursão.
janmoesen
Editado para adicionar um comportamento recursivo ...
Sardathrion - contra abuso de SE
Por favor, não promova find | xargs. Em find -execvez disso, use como mencionei na minha resposta. Mais fácil e seguro.
janmoesen
Tentei isso, sem resultado. O comando retorna imediatamente e nada muda dentro dos arquivos.
Ivan
isso não foi testado, mas a essência dele funcionará.
Sardathrion - contra abuso do SE