URL: https://www.opennet.me/cgi-bin/openforum/vsluhboard.cgi
Форум: vsluhforumID1
Нить номер: 55525
[ Назад ]

Исходное сообщение
"Заменить пробелы табуляцией"

Отправлено Makc2K , 13-Апр-05 22:43 
Мне нужно в среде bash найти в строке вхождения одного или нескольких пробелов, идущих подряд и заменть найденую подстроку на табуляцию. Я вот дошел до такого

sed 's/[ *]/\t/g'

- но он заменяет каждый найденный пробел. Побовал + вместо * и без квадратных скобок - не помогает. Подкиньте идейку.


Содержание

Сообщения в этом обсуждении
"Заменить пробелы табуляцией"
Отправлено madskull , 13-Апр-05 22:59 
>Мне нужно в среде bash найти в строке вхождения одного или нескольких
>пробелов, идущих подряд и заменть найденую подстроку на табуляцию. Я вот
>дошел до такого
>
>sed 's/[ *]/\t/g'
>
> - но он заменяет каждый найденный пробел. Побовал + вместо *
>и без квадратных скобок - не помогает. Подкиньте идейку.

может unexpand поможет?


"Заменить пробелы табуляцией"
Отправлено Makc2K , 14-Апр-05 14:02 
Вроде как работает, но коряво. Не все подстроки состоящие из подряд идущих пробелов заменяет на табуляцию. В мане сказано, что 2 и более подряд идущих пробелов, но нифига.



"Заменить пробелы табуляцией"
Отправлено nrvalex , 14-Апр-05 14:18 
sed  "s/  */\t/g"
        ^ 2 пробела

"Заменить пробелы табуляцией"
Отправлено Makc2K , 14-Апр-05 14:40 
Я не знаю, может sed у меня убогий, но \t он непонимает как таб., вместо таба рисует t. Относительно шаблона - он не правильный. Звездочка означает любой символ. Вот правильные шаблоны:

( )+   ищет один или более пробелов подряд
\s+    ищет все символы входящие в класс s (пробелы, табы)

в sed они нихрена не работают.



"Заменить пробелы табуляцией"
Отправлено unk , 14-Апр-05 14:46 
>( )+   ищет один или более пробелов подряд
\( \)\+

>\s+    ищет все символы входящие в класс s (пробелы,
>табы)
это pcre - sed не умеет
[[:space:]]\+

>в sed они нихрена не работают.
Вы его готовить не умеете и маны читать не любите...



"Заменить пробелы табуляцией"
Отправлено Makc2K , 14-Апр-05 15:13 
С манами действит. проблема, но не от лени, а от слабого английского и сленга писателей.

А вот это \( \)\+  интерпритация sed? Зачем экранировать служ. символы?

Уже не первый раз вы мне помогли. Вот правильная команда:

sed -E 's/[[:space:]]+/@/g'

Вот только не ясно как вместо собаки заставить вставлять таб.


"Заменить пробелы табуляцией"
Отправлено unk , 14-Апр-05 15:38 
>А вот это \( \)\+  интерпритация sed? Зачем экранировать служ. символы?
Это POSIX.

>Вот только не ясно как вместо собаки заставить вставлять таб.
А вот этого sed (покрайней мере  мой) не может.
Сделайте например sed|tr '@' '\t'


"Заменить пробелы табуляцией"
Отправлено Makc2K , 14-Апр-05 15:43 
>>А вот это \( \)\+  интерпритация sed? Зачем экранировать служ. символы?
>Это POSIX.
- Может это POSIX, но я + не экранировал и это отработало. Насколько я понимаю слешем мы превращаем спецсимвол в обычный и наоборот. А скобки нужны исключительно как служебные.

Спасибо!


"Заменить пробелы табуляцией"
Отправлено jonatan , 14-Апр-05 15:56 
У меня отработало так

sed "s/\( \)\+/\t/g"
или
sed "s/[[:space:]]\+/\t/g"

GNU bash, version 2.05b.0(1)-release (i686-redhat-linux-gnu)
GNU sed version 4.0.7


"Заменить пробелы табуляцией"
Отправлено unk , 14-Апр-05 16:02 
>GNU sed version 4.0.7
У меня на этой машине нет гнутого sed.
т.е. ваше решение не портабельно :)


"Заменить пробелы табуляцией"
Отправлено jonatan , 14-Апр-05 16:21 
Может такие еще варианты подойдут на других версиях

sed "s/\( \)\+/\x09/g"
sed "s/\( \)\+/`echo \\\t`/g"
или просто вставить табуляцию комбинацией Ctrl-V и Ctrl-I
sed "s/\( \)\+/    /g"


"Заменить пробелы табуляцией"
Отправлено unk , 14-Апр-05 16:37 
>Может такие еще варианты подойдут на других версиях
>
>sed "s/\( \)\+/\x09/g"
Это у меня не сработало.

>sed "s/\( \)\+/`echo \\\t`/g"
Это работает, но в виде echo -e '\t'

>или просто вставить табуляцию комбинацией Ctrl-V и Ctrl-I
не работает в sh и ksh - идти на машину с bash лень :)
(Похоже gnu тут рулит)

PS:
а кто сможет объяснить почему так странно работает unexpand -a


"Заменить пробелы табуляцией"
Отправлено lavr , 14-Апр-05 15:42 
>С манами действит. проблема, но не от лени, а от слабого английского
>и сленга писателей.
>
>А вот это \( \)\+  интерпритация sed? Зачем экранировать служ. символы?
>
>
>Уже не первый раз вы мне помогли. Вот правильная команда:
>
>sed -E 's/[[:space:]]+/@/g'
>
>Вот только не ясно как вместо собаки заставить вставлять таб.

вариантов тьма: зависит от SHELL (man ваш_shell), от редактора - man редактор, от ... да хоть printf или echo - выбирайте что больше нравится


"Заменить пробелы табуляцией"
Отправлено nrvalex , 14-Апр-05 16:21 
>Я не знаю, может sed у меня убогий, но \t он непонимает
>как таб., вместо таба рисует t. Относительно шаблона - он не
>правильный. Звездочка означает любой символ. Вот правильные шаблоны:
>( )+   ищет один или более пробелов подряд
>\s+    ищет все символы входящие в класс s (пробелы,
>табы)
>
>в sed они нихрена не работают.

$ echo "a    33b c" | sed "s/\x20\x20*/@/g"
a@33b@c
$ echo "a    33b c" | sed  "s/\x20\x20*/\x9/g"
a       33b     c