Jak zamienić wszystkie zakładki w każdym pliku w gałęzi systemu plików na 2 spacje?

10

Koduję Scalę, a jej konwencją jest używanie podwójnych spacji na poziom do identyfikacji. Ale używanie różnych edytorów sprawia, że ​​moje źródła są wypełnione mieszanką spacji i tabulatorów.

Chciałbym refaktoryzować wszystkie pliki (tak naprawdę pliki * .scala, ale określenie tego nie jest konieczne) (w danym katalogu i całej gałęzi FS (rekurencyjnie)) automatycznie, zastępując wszystkie tabulatory podwójnymi spacjami. Wierzę, że jest to łatwy i piękny sposób na zrobienie tego za pomocą klasycznych narzędzi Unix / GNU, ale brakuje mi doświadczenia w tej dziedzinie. Czy byłbyś tak miły, aby mi pomóc?

Ivan
źródło

Odpowiedzi:

9

Rekurencyjnie, używając expand(który został stworzony w tym celu):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' {} +

Zrobiłbym to z sedlub perl(patrz odpowiedź Sardathriona), ponieważ obsługują one edycję bezpośrednią, ale i tak chciałem wspomnieć o dobrym starym expand.

EDYCJA: Tak byłoby find . -type f -name '*.scala' -exec perl -p -i -e $'s/\t/ /g' {} +

janmoesen
źródło
Pierwszy wariant działa zgodnie z oczekiwaniami. Drugi wariant (perl) zastępuje tabulator tylko jedną spacją zamiast dwóch.
Ivan
Tak, przepraszam: to był błąd formatowania. Kod źródłowy mówi dwie spacje, ale renderowany HTML pokazuje tylko jedną spację.
janmoesen
10

To powinno to zrobić:

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

Uwaga: nie zostało to przetestowane.

Sardathrion - przeciw nadużyciom SE
źródło
1
To jeszcze nie jest rekurencyjne. Możesz użyć findpowłoki lub powłoki obsługującej **/*.scalarekurencję.
janmoesen
Edytowane w celu dodania zachowania rekurencyjnego ...
Sardathrion - przeciwko nadużyciom SE
Proszę nie promować find | xargs. Użyj find -execzamiast tego, jak wspomniałem w mojej odpowiedzi. Łatwiej i bezpieczniej.
janmoesen
Próbowałem tego, bez rezultatu. Polecenie natychmiast wraca i nic się nie zmienia w plikach.
Ivan
nie jest to testowane, ale jego istota będzie działać.
Sardathrion - przeciwko nadużyciom SE