Мне нужно в среде bash найти в строке вхождения одного или нескольких пробелов, идущих подряд и заменть найденую подстроку на табуляцию. Я вот дошел до такогоsed 's/[ *]/\t/g'
- но он заменяет каждый найденный пробел. Побовал + вместо * и без квадратных скобок - не помогает. Подкиньте идейку.
>Мне нужно в среде bash найти в строке вхождения одного или нескольких
>пробелов, идущих подряд и заменть найденую подстроку на табуляцию. Я вот
>дошел до такого
>
>sed 's/[ *]/\t/g'
>
> - но он заменяет каждый найденный пробел. Побовал + вместо *
>и без квадратных скобок - не помогает. Подкиньте идейку.может unexpand поможет?
Вроде как работает, но коряво. Не все подстроки состоящие из подряд идущих пробелов заменяет на табуляцию. В мане сказано, что 2 и более подряд идущих пробелов, но нифига.
sed "s/ */\t/g"
^ 2 пробела
Я не знаю, может sed у меня убогий, но \t он непонимает как таб., вместо таба рисует t. Относительно шаблона - он не правильный. Звездочка означает любой символ. Вот правильные шаблоны:( )+ ищет один или более пробелов подряд
\s+ ищет все символы входящие в класс s (пробелы, табы)в sed они нихрена не работают.
>( )+ ищет один или более пробелов подряд
\( \)\+>\s+ ищет все символы входящие в класс s (пробелы,
>табы)
это pcre - sed не умеет
[[:space:]]\+>в sed они нихрена не работают.
Вы его готовить не умеете и маны читать не любите...
С манами действит. проблема, но не от лени, а от слабого английского и сленга писателей.А вот это \( \)\+ интерпритация sed? Зачем экранировать служ. символы?
Уже не первый раз вы мне помогли. Вот правильная команда:
sed -E 's/[[:space:]]+/@/g'
Вот только не ясно как вместо собаки заставить вставлять таб.
>А вот это \( \)\+ интерпритация sed? Зачем экранировать служ. символы?
Это POSIX.>Вот только не ясно как вместо собаки заставить вставлять таб.
А вот этого sed (покрайней мере мой) не может.
Сделайте например sed|tr '@' '\t'
>>А вот это \( \)\+ интерпритация sed? Зачем экранировать служ. символы?
>Это POSIX.
- Может это POSIX, но я + не экранировал и это отработало. Насколько я понимаю слешем мы превращаем спецсимвол в обычный и наоборот. А скобки нужны исключительно как служебные.Спасибо!
У меня отработало так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
>GNU sed version 4.0.7
У меня на этой машине нет гнутого sed.
т.е. ваше решение не портабельно :)
Может такие еще варианты подойдут на других версияхsed "s/\( \)\+/\x09/g"
sed "s/\( \)\+/`echo \\\t`/g"
или просто вставить табуляцию комбинацией Ctrl-V и Ctrl-I
sed "s/\( \)\+/ /g"
>Может такие еще варианты подойдут на других версиях
>
>sed "s/\( \)\+/\x09/g"
Это у меня не сработало.>sed "s/\( \)\+/`echo \\\t`/g"
Это работает, но в виде echo -e '\t'>или просто вставить табуляцию комбинацией Ctrl-V и Ctrl-I
не работает в sh и ksh - идти на машину с bash лень :)
(Похоже gnu тут рулит)PS:
а кто сможет объяснить почему так странно работает unexpand -a
>С манами действит. проблема, но не от лени, а от слабого английского
>и сленга писателей.
>
>А вот это \( \)\+ интерпритация sed? Зачем экранировать служ. символы?
>
>
>Уже не первый раз вы мне помогли. Вот правильная команда:
>
>sed -E 's/[[:space:]]+/@/g'
>
>Вот только не ясно как вместо собаки заставить вставлять таб.вариантов тьма: зависит от SHELL (man ваш_shell), от редактора - man редактор, от ... да хоть printf или echo - выбирайте что больше нравится
>Я не знаю, может 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