Как преобразовать пробелы в табуляции в вашей программе

По code guidelines PHPbb в коде нужно использовать табуляции, вместо пробелов. К сожалению, я об этом поздновато узнал, теперь надо всё, что я написал привести к правильному виду.

Оказывается, в Linux есть специальная утилита для этого — unexpand (находится в пакете coreutils). Кстати, есть и противоположная по действию утилита — expand.
6 октября 2010 16:01

hshhhhh.name (hshhhhh.name)
6 октября 2010, 18:37

find -name '*.php' -exec sed -i 's/ /\t/;' '{}';

bolk (bolknote.ru)
6 октября 2010, 19:24, ответ предназначен hshhhhh.name:

Как заменить только те пробелы, которые в начале строки?

astur (astur.net.ru)
6 октября 2010, 19:26, ответ предназначен hshhhhh.name:

Хорошее направление мысли, но такая строчка исправит все пробелы, а не только форматирующие. Можно, конечно сделать что-то типа `'s/^ /\t/'`, но тогда надо будет прогонять несколько раз (тем больше, чем глубже форматирование отступами). Всё-таки, coreutils - это не просто по приколу.

bolk (bolknote.ru)
6 октября 2010, 19:41, ответ предназначен hshhhhh.name:

Естественно, должны заменяться по количеству пробелов, 16 пробелов — две табуляции, 8 — одна.

Илья Бирман (инкогнито)
6 октября 2010, 21:01

Я думал это любой текстовый редактор умеет делать. Text → Entab (или Detab) в ББЭдите, например.

bolk (bolknote.ru)
6 октября 2010, 22:05, ответ предназначен Илье Бирману

Понятия не имею. А зачем мне текстовый редактор, если всё можно сделать одной строкой?

Viperet (viperet.info)
7 октября 2010, 00:21

Такая функция есть в каждом первом текстовом редакторе для программистов, ну и perl-программисты за 5 минут напишут соответствующий скрипт в одну строчку или оформят в форме какого нибудь верблюда, по желанию...
Кстати, приятно - expand и unexpand есть в MacOS, ничего ставить не надо

hshhhhh.name (hshhhhh.name)
7 октября 2010, 00:26, ответ предназначен astur (astur.net.ru):

Хорошее направление мысли, но такая строчка исправит все пробелы, а не только форматирующие.
find -name '*.php' -exec sed -i 's/^( ){24}/\t\t\t/;s/^( ){16}/\t\t/;s/^( ){8}/\t/;' '{}';

hshhhhh.name (hshhhhh.name)
7 октября 2010, 00:27, ответ предназначен bolk (bolknote.ru):

16 пробелов — две табуляции, 8 — одна.
дикость какая. всю жизнь считал что табуляция = 4 пробела.

hshhhhh.name (hshhhhh.name)
7 октября 2010, 00:28, ответ предназначен Viperet (viperet.info):

perl-программисты за 5 минут напишут соответствующий скрипт в одну строчку или оформят в форме какого нибудь верблюда
а другие, другие программисты справятся?

bolk (bolknote.ru)
7 октября 2010, 09:22, ответ предназначен hshhhhh.name:

find -name '*.php' -exec sed -i 's/^( ){24}/\t\t\t/;s/^( ){16}/\t\t/;s/^( ){8}/\t/;' '{}';
Ну вот оно надо так извращаться? Если можно одной командой сделать. Тем более, что тут всего лишь третья вложенность.
дикость какая. всю жизнь считал что табуляция = 4 пробела.
Табуляция *обычно* равна 4 или 8 пробелам. Например, в DOS это 8 символов.

bolk (bolknote.ru)
7 октября 2010, 09:25, ответ предназначен Viperet (viperet.info):

Такая функция есть в каждом первом текстовом редакторе для программистов
Т. е. мне предлагается вручную найти те файлы, которые я изменял, их открыть, вызвать эту функцию каждого первого текстового редактора и сохранить? Давайте я уж тремя командами командной строки их как-нибудь сразу все обработаю?
ну и perl-программисты за 5 минут напишут соответствующий скрипт в одну строчку или оформят в форме какого нибудь верблюда, по желанию
Да есть уже такая утилита, вот на: unexpand, зачем писать ещё что-то?

hshhhhh.name (hshhhhh.name)
7 октября 2010, 13:13, ответ предназначен bolk (bolknote.ru):

Ну вот оно надо так извращаться?
По-моему весело. Можно еще и регу модную написать а не тупо копипасту :). Ну и я не мастер bash'a, там наверняка есть более хитрые решения.

На повершелле так же легко можно сделать?

bolk (bolknote.ru)
7 октября 2010, 13:55, ответ предназначен hshhhhh.name:

На повершелле так же легко можно сделать?
Ну, можно сделать замену пробелов в начале строки для любого уровня, например, так:

cat file | %{ If ($_ -match '^(?: {4})+') { $_ -replace $matches[0], ("`t" * ($matches[0].length / 4)) } Else {$_} }

jankkhvej (jankkhvej.blogspot.com)
7 октября 2010, 14:46

В чём вы работаете, в каком редакторе? Вы вручную там отступы делали пробелами? Или специально делали всё пробелами?

bolk (bolknote.ru)
7 октября 2010, 16:32, ответ предназначен jankkhvej (jankkhvej.blogspot.com):

В чём вы работаете, в каком редакторе?
В данном проекте я пользовался FARом
Вы вручную там отступы делали пробелами? Или специально делали всё пробелами?
У меня стоит настройка «преобразовывать табуляции в пробелы».

jankkhvej (jankkhvej.blogspot.com)
7 октября 2010, 20:24, ответ предназначен bolk (bolknote.ru):

У меня стоит настройка «преобразовывать табуляции в пробелы».
Но зачем?!

bolk (bolknote.ru)
7 октября 2010, 21:17, ответ предназначен jankkhvej (jankkhvej.blogspot.com):

Я, в последнее время, пишу чаще всего на Python, а там используются 4 пробела в качестве отступа: http://www.python.org/dev/peps/pep-0008/

Но есть люди, которые не соблюдают style guide, лучше автоматически исправлять исходники.

jankkhvej (jankkhvej.blogspot.com)
8 октября 2010, 13:49, ответ предназначен bolk (bolknote.ru):

Удивлён предпочтением к пробелам в Python. Рад, что там всё-таки не отказались от \t.

Ваше имя или адрес блога (можно OpenID):

Текст вашего комментария, не HTML:

Кому бы вы хотели ответить (или кликните на его аватару)