2009-12-06 3 views
5

Как вы говорите следующее регулярное выражение:Преобразование пространства для вкладок в RegEx

foreach line 
    look at the beginning of the string and convert every group of 3 spaces to a tab 
    Stop once a character other than a space is found 

Это то, что я до сих пор:

/^ +/\t/g 

Однако это превращает каждое пространство 1 таб

Любая помощь будет оценена по достоинству.

+1

Пожалуйста, напишите код, который вы написали. Люди обычно не любят просто писать для вас код. –

ответ

7

С Perl:

perl -pe '1 while s/\G {3}/\t/gc' input.txt >output.txt 

Например, при следующем входе

nada 
    three spaces 
    four spaces 
    three in the middle 
     six space 

выход (ТКС заменен \t) является

$ perl -pe '1 while s/\G {3}/\t/gc' input | perl -pe 's/\t/\\t/g' 
nada 
\tthree spaces 
\t four spaces 
\tthree in the middle 
\t\tsix spaces 
+1

Грег, спасибо за отличный ответ! Однако, похоже, это излишне сложно. И '1 while', и' // c' кажутся излишними. Чтобы быть уверенным, я попытался запустить ваш образец ввода со всеми перестановками сохранения/исключения этих двух лишних элементов и получения идентичного вывода. Таким образом, можно упростить код, просто используя 'perl -pe 's/\ G {3}/\ t/g'' –

-1

Вы, вероятно, хотите /^(?: {3})*/\t/g

Редактировать: исправлено

+0

. Это преобразует 3 пробела в 1 вкладку, но также 6 или 9 или 12 и т. Д. 1 вкладка. –

+0

не фиксировано. Попробуйте запустить его в образце данных Грега Бэкона. «Нада» и «шесть пространств» сломаны. И не хватает ведущих 's'. –

3

Я знаю, что это старый вопрос, но я думал, что дам полный регулярный запрос, который работает (ну, это сработало для меня).

s/\t* {3}/\t/g 

Я обычно использую это, чтобы преобразовать весь документ в Vim сделать это в Vim это выглядит следующим образом:

:%s/\t* \{3\}/\t/g 

Надеется, что это все-таки кто-то помогает.

+1

Преобразует пробелы в середину строки, нарушая «Остановить один раз, когда будет найден символ, отличный от пробела» –

Смежные вопросы