Как заменить все вкладки в каждом файле в ветви файловой системы двумя пробелами в каждой?

10

Я кодирую Scala и принято использовать двойные пробелы на уровне для идентификации. Но использование разных редакторов делает мои источники заполненными смесью пробелов и вкладок.

Я хотел бы провести рефакторинг всех файлов (на самом деле, файлов * .scala, но указывать это не обязательно) (в заданном каталоге и во всей базовой ветви FS (рекурсивно)) автоматически, заменяя все вкладки двойными пробелами. Я считаю, что есть простой и красивый способ сделать это с помощью классических инструментов Unix / GNU, но мне не хватает опыта в этой области. Не могли бы вы мне помочь?

Иван
источник

Ответы:

9

Рекурсивно, используя expand(что было сделано для этой цели):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' {} +

Я бы сделал это с помощью sedили perl(см. Ответ Сардатриона), потому что они поддерживают встроенное редактирование, но я expandвсе равно хотел упомянуть о хорошем .

РЕДАКТИРОВАТЬ: Это было бы find . -type f -name '*.scala' -exec perl -p -i -e $'s/\t/ /g' {} +

janmoesen
источник
Первый вариант работает как положено. Второй (perl) вариант заменяет табуляцию только одним пробелом вместо двух.
Иван
Да, извините: это была ошибка форматирования. Исходный код говорит о двух пробелах, но отображаемый HTML показывает только один пробел.
Янмезен
10

Это должно сделать это:

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

Примечание: это не проверено.

Сардатрион - против злоупотребления SE
источник
1
Это еще не рекурсивно. Вы можете использовать findили оболочку, которая поддерживает **/*.scalaрекурсию.
Янмезен
Отредактировано, чтобы добавить рекурсивное поведение ...
Сардатрион - против злоупотребления SE
Пожалуйста, не рекламируйте find | xargs. Используйте find -execвместо этого, как я упоминал в своем ответе. Проще и безопаснее.
Янмезен
Пробовал это, безрезультатно. Команда немедленно возвращается, и внутри файлов ничего не меняется.
Иван
это не проверено, но суть его будет работать.
Сардатрион - против злоупотребления SE