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


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' {} +


Первый вариант работает как положено. Второй (perl) вариант заменяет табуляцию только одним пробелом вместо двух.
Иван

Да, извините: это была ошибка форматирования. Исходный код говорит о двух пробелах, но отображаемый HTML показывает только один пробел.
Янмезен

10

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

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

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


1
Это еще не рекурсивно. Вы можете использовать findили оболочку, которая поддерживает **/*.scalaрекурсию.
Янмезен

Отредактировано, чтобы добавить рекурсивное поведение ...
Сардатрион - против злоупотребления SE

Пожалуйста, не рекламируйте find | xargs. Используйте find -execвместо этого, как я упоминал в своем ответе. Проще и безопаснее.
Янмезен

Пробовал это, безрезультатно. Команда немедленно возвращается, и внутри файлов ничего не меняется.
Иван

это не проверено, но суть его будет работать.
Сардатрион - против злоупотребления SE
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.