Як замінити всі вкладки у кожному файлі у відділенні файлової системи з 2 пробілами?


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(див. Відповідь Сардатріона), оскільки вони підтримують вбудоване редагування, але я хотів би згадати добрий ol 'у expandбудь-якому випадку.

EDIT: Це було б find . -type f -name '*.scala' -exec perl -p -i -e $'s/\t/ /g' {} +


Перший варіант працює як очікувалося. Другий (perl) варіант замінює вкладку лише одним пробілом замість двох.
Іван

Так, вибачте: це була помилка форматування. Вихідний код говорить про два пробіли, але виведений HTML показує лише один.
janmoesen

10

Це слід зробити:

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

Примітка: це не перевірено.


1
Це ще не є рекурсивним. Можна використовувати findабо оболонку, яка підтримує **/*.scalaрекурсію.
janmoesen

Відредаговано, щоб додати рекурсивну поведінку ...
Сардатріон - проти зловживання SE

Будь ласка, не рекламуйте find | xargs. Використовуйте find -execнатомість, як я вже згадував у своїй відповіді. Легше і безпечніше.
janmoesen

Спробував це, результату немає. Команда повертається негайно, і нічого не змінюється всередині файлів.
Іван

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