The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]

форумы  помощь  поиск  регистрация  майллист  ВХОД  слежка  RSS
"Заменить пробелы табуляцией"
Вариант для распечатки  
Пред. тема | След. тема 
Форумы OpenNET: Виртуальная конференция (Public)
Изначальное сообщение [Проследить за развитием треда]

"Заменить пробелы табуляцией" 
Сообщение от Makc2K emailИскать по авторуВ закладки(ok) on 13-Апр-05, 22:43  (MSK)
Мне нужно в среде bash найти в строке вхождения одного или нескольких пробелов, идущих подряд и заменть найденую подстроку на табуляцию. Я вот дошел до такого

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

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

  Правка | Высказать мнение | Ответить | Рекомендовать в FAQ | Cообщить модератору | Наверх

 Оглавление

Индекс форумов | Темы | Пред. тема | След. тема
Сообщения по теме

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

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

  Удалить Правка | Высказать мнение | Ответить | Рекомендовать в FAQ | Cообщить модератору | Наверх

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


  Удалить Правка | Высказать мнение | Ответить | Рекомендовать в FAQ | Cообщить модератору | Наверх

3. "Заменить пробелы табуляцией" 
Сообщение от nrvalex Искать по авторуВ закладки on 14-Апр-05, 14:18  (MSK)
sed  "s/  */\t/g"
        ^ 2 пробела
  Удалить Правка | Высказать мнение | Ответить | Рекомендовать в FAQ | Cообщить модератору | Наверх

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

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

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


  Удалить Правка | Высказать мнение | Ответить | Рекомендовать в FAQ | Cообщить модератору | Наверх

5. "Заменить пробелы табуляцией" 
Сообщение от unk Искать по авторуВ закладки(ok) on 14-Апр-05, 14:46  (MSK)
>( )+   ищет один или более пробелов подряд
\( \)\+

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

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


  Удалить Правка | Высказать мнение | Ответить | Рекомендовать в FAQ | Cообщить модератору | Наверх

6. "Заменить пробелы табуляцией" 
Сообщение от Makc2K emailИскать по авторуВ закладки(ok) on 14-Апр-05, 15:13  (MSK)
С манами действит. проблема, но не от лени, а от слабого английского и сленга писателей.

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

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

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

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

  Удалить Правка | Высказать мнение | Ответить | Рекомендовать в FAQ | Cообщить модератору | Наверх

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

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

  Удалить Правка | Высказать мнение | Ответить | Рекомендовать в FAQ | Cообщить модератору | Наверх

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

Спасибо!

  Удалить Правка | Высказать мнение | Ответить | Рекомендовать в FAQ | Cообщить модератору | Наверх

10. "Заменить пробелы табуляцией" 
Сообщение от jonatan Искать по авторуВ закладки(??) on 14-Апр-05, 15:56  (MSK)
У меня отработало так

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

  Удалить Правка | Высказать мнение | Ответить | Рекомендовать в FAQ | Cообщить модератору | Наверх

11. "Заменить пробелы табуляцией" 
Сообщение от unk Искать по авторуВ закладки(ok) on 14-Апр-05, 16:02  (MSK)
>GNU sed version 4.0.7
У меня на этой машине нет гнутого sed.
т.е. ваше решение не портабельно :)

  Удалить Правка | Высказать мнение | Ответить | Рекомендовать в FAQ | Cообщить модератору | Наверх

12. "Заменить пробелы табуляцией" 
Сообщение от jonatan Искать по авторуВ закладки(??) on 14-Апр-05, 16:21  (MSK)
Может такие еще варианты подойдут на других версиях

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

  Удалить Правка | Высказать мнение | Ответить | Рекомендовать в FAQ | Cообщить модератору | Наверх

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

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

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

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

  Удалить Правка | Высказать мнение | Ответить | Рекомендовать в FAQ | Cообщить модератору | Наверх

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

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

  Удалить Правка | Высказать мнение | Ответить | Рекомендовать в FAQ | Cообщить модератору | Наверх

13. "Заменить пробелы табуляцией" 
Сообщение от nrvalex Искать по авторуВ закладки on 14-Апр-05, 16:21  (MSK)
>Я не знаю, может 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

  Удалить Правка | Высказать мнение | Ответить | Рекомендовать в FAQ | Cообщить модератору | Наверх


Архив | Удалить

Индекс форумов | Темы | Пред. тема | След. тема
Оцените тред (1=ужас, 5=супер)? [ 1 | 2 | 3 | 4 | 5 ]
Пожалуйста, прежде чем написать сообщение, ознакомьтесь с данными рекомендациями.




Партнёры:
PostgresPro
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2025 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру