Comment remplacer tous les onglets de chaque fichier dans une branche de système de fichiers avec 2 espaces chacun?

10

Je code Scala et sa convention est d'utiliser des espaces doubles par niveau pour l'identification. Mais l'utilisation de différents éditeurs rend mes sources remplies d'un mélange d'espaces et d'onglets.

Je voudrais refactoriser tous les fichiers (fichiers * .scala, en fait, mais cela n'est pas nécessaire) (dans un répertoire donné et toute la branche FS sous-jacente (récursivement)) automatiquement, en remplaçant tous les onglets par des espaces doubles. Je crois qu'il y a une manière simple et belle de le faire avec les outils Unix / GNU classiques, mais je manque d'expérience dans ce domaine. Seriez-vous si gentil à m'aider?

Ivan
la source

Réponses:

9

Récursivement, en utilisant expand(ce qui a été fait à cet effet):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' {} +

Je le ferais avec sedou perl(voir la réponse de Sardathrion) car ils prennent en charge l'édition en ligne, mais je voulais expandquand même mentionner le bon vieux .

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

janmoesen
la source
La première variante fonctionne comme prévu. La deuxième variante (perl) remplace un onglet avec un seul espace au lieu de deux.
Ivan
Ouais, désolé: c'était une erreur de formatage. Le code source indique deux espaces, mais le HTML rendu n'en affiche qu'un.
janmoesen
10

Cela devrait le faire:

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

Remarque: ceci n'est pas testé.

Sardathrion - contre les abus SE
la source
1
Ce n'est pas encore récursif. Vous pouvez utiliser findou un shell qui prend en charge la **/*.scalarécursivité.
janmoesen
Modifié pour ajouter un comportement récursif ...
Sardathrion - contre les abus SE
Veuillez ne pas promouvoir find | xargs. Utilisez find -execplutôt, comme je l'ai mentionné dans ma réponse. Plus simple et plus sûr.
janmoesen
J'ai essayé ça, pas de résultat. La commande revient immédiatement et rien ne change à l'intérieur des fichiers.
Ivan
ce n'est pas testé mais l'essentiel fonctionnera.
Sardathrion - contre les abus SE