Ок, ни одно из приведенных решений меня не устроило, поэтому я написал это сам. :)
См. здесь:
Вы можете использовать регулярное выражение для замены N пробелов символом табуляции. Например, в Python:
import re
re.sub('[ ]{4}', '\t', text)
В зависимости от исходного языка вы можете попробовать GNU indent . Он может делать множество вещей, связанных с отступом исходного кода, хотя может быть более сложным, чем вам нужно.
Например, если я дам следующую программу для indent -di0
#include <stdio.h>
int main(int argc, char **argv)
{
int i;
int j;
for (i = 0; i < 10; i++)
{
for (j = 0; j < 10; j++)
{
printf("x");
}
}
}
, она заменит ее на:
#include <stdio.h>
int
main(int argc, char **argv)
{
int i;
int j;
for (i = 0; i < 10; i++) {
for (j = 0; j < 10; j++) {
printf("x");
}
}
}
Или, если вам нужно что-то глупое простое, есть expand / undepand
команды.
Вот возможное решение на Python:
import re
import fileinput
pat = re.compile("^( )+")
for line in fileinput.input(inplace=True):
print pat.sub(lambda m: "\t" * (m.end() // 2), line, 1),
Две вещи,
sed -i
ваш друг - sed -i XXX.txt 's / ^ [] \ {2 \} / \ t / g '
Учитывая, что мой AWK-fu не силен (и я не знаю, может ли он делать то, что не может № 2), я напишу PHP-скрипт для вычисления пробелов и замены их табуляциями.
Это преобразует ведущие пробелы (даже перемежающиеся с табуляциями) в табуляции. Укажите количество пробелов для преобразования, задав переменную. Лишние пробелы будут сведены к нулю. Пробелы и табуляции, которые появляются после любого символа, кроме пробела или табуляции, не трогаются.
tstop=2
sed "s/^\([[:blank:]]*\)\(.*\)/\1\n\2/;h;s/[^[\n]*//;x;s/\n.*//;s/ \{$tstop\}/X/g;s/ //g;G;s/\n//g" inputfile
Пример:
[space][space][tab][tab][space][space][space][tab][space]TEXT[space][space][space]
будет преобразован в
[tab][tab][tab][tab][tab]TEXT[space][space][space]
Если это не совсем то, что вам нужно, можно внести коррективы.