The OpenNET Project / Index page

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

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

"sed: Как заменить символ конца строки на запятую"  
Сообщение от Medlar email(??) on 03-Сен-08, 15:30 
Нужно вывод grep
echo $To|egrep -o "[[:allnum:]]+@domain.ru"

который дает результат
user1@domain.ru
user2@domain.ru

преобразовать в одну строку:
user1@domain.ru, user2@domain.ru

Пробовалось:
echo $To|egrep -o "[[:allnum:]]+@domain.ru"| sed s/\n/,/g
echo $To|egrep -o "[[:allnum:]]+@domain.ru"| sed s/$/,/g
echo $To|egrep -o "[[:allnum:]]+@domain.ru"| sed s/xOA/,/g
ну и т.д. без результата

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

 Оглавление

Сообщения по теме [Сортировка по времени | RSS]


1. "sed: Как заменить символ конца строки на запятую"  
Сообщение от Medlar email(??) on 03-Сен-08, 16:05 
нашлось 2 решения
sed -ni 'H;${x;s/\n//g;p}' file
и
tr "\n" ","

Но!
первое дает лишнюю запятую вначале вывода
а второе - лишнюю запятую в конце

кол-во юзеров в выводе echo $To|egrep -o "[[:allnum:]]+@domain.ru" может быть произвольным

теперь добавляем в первую команду sed s/,$//g
во вторую - sed s/^,//
и получаем то, что нужно.

Хотелось бы узнать, может есть более рациональное решение этой задачки

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

2. "sed: Как заменить символ конца строки на запятую"  
Сообщение от ANF email on 03-Сен-08, 22:57 
paste -s -d ','


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

3. "sed: Как заменить символ конца строки на запятую"  
Сообщение от Medlar email(??) on 04-Сен-08, 13:29 
Спасибо большое - то, что надо!
Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

4. "sed: Как заменить символ конца строки на запятую"  
Сообщение от Andrey Mitrofanov on 04-Сен-08, 14:17 
>Спасибо большое - то, что надо!

У "того, что надо" тоже лишние запятые могут образовываться -
$ echo -e "111\n222\n\n"|paste -s -d ,
111,222,,
$ _
Рекомендую %)  `|sed 's/^,+//;s/,+$//;s/,,+/,/g'`

>>>user1@domain.ru, user2@domain.ru

Кстати, вам "," или ", "? B-))
|sed 's/ *, */,/g;s/^,+//;s/,+$//;s/,+/, /g'

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

5. "sed: Как заменить символ конца строки на запятую"  
Сообщение от angra (ok) on 04-Сен-08, 15:04 
Ну тогда можно и такой вариант :)
echo -e "111\n222\n\n" |perl -le 'print join(",",grep {s/[\n\r]//;$_} <>)'
Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

6. "sed: Как заменить символ конца строки на запятую"  
Сообщение от Medlar email(??) on 04-Сен-08, 15:08 
>У "того, что надо" тоже лишние запятые могут образовываться -
>$ echo -e "111\n222\n\n"|paste -s -d ,
>111,222,,
>$ _

В моем случае не образуются:
исходная строка - это поле To: из почтового заголовка
Я выделяю из него только получателей своего домена с.п. egrep -o
эта команда дает построчный вывод, если моих получателей несколько

Поскольку далее необходимо разослать уведомления с.п. procmail этим локальным получателям, поэтому
нужно построчный вывод преобразовать в одну строку  и к тому же разделить получателей запятыми и записать ее в To: , будет там еще пробел или нет - это несущественно

При таком раскладе пустых строк просто не будет и paste вполне подойдет
Но вам тоже большое спасибо, ваши примеры обязательно сохраню - пригодятся ;)

>Рекомендую %)  `|sed 's/^,+//;s/,+$//;s/,,+/,/g'`
>
>>>>user1@domain.ru, user2@domain.ru
>
>Кстати, вам "," или ", "? B-))
>|sed 's/ *, */,/g;s/^,+//;s/,+$//;s/,+/, /g'

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

7. "Как заменить символ"  
Сообщение от Andrey Mitrofanov on 04-Сен-08, 15:40 
>Но вам тоже большое спасибо, ваши примеры обязательно сохраню - пригодятся ;)

Не-а, не пригодятся... Нужно брать в руки примеры, man sed и учиться их разбирать-читать-понимать. Если они остаются "магическим заклинанием", то не пригодятся и в следующий раз, когда надо будет, даже и в голову не придёт (вот прямо %) как мне - с перлом). Впрочем, большое пожалуйста.

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

8. "Как заменить символ"  
Сообщение от Medlar email(??) on 04-Сен-08, 15:49 
>>Но вам тоже большое спасибо, ваши примеры обязательно сохраню - пригодятся ;)
>
>Не-а, не пригодятся... Нужно брать в руки примеры, man sed и учиться
>их разбирать-читать-понимать. Если они остаются "магическим заклинанием", то не пригодятся и
>в следующий раз, когда надо будет, даже и в голову не
>придёт (вот прямо %) как мне - с перлом). Впрочем, большое
>пожалуйста.

Ну разве я где сказала, что буду использовать это только как заклинание?
Не знаю, как вам, а мне легче осваивать что-то новое, когда под рукой много примеров.
man sed,grep,etc применялся, но вы, наверное, тоже стакливались с тем, что в состоянии цейтнота бывает трудновато сразу найти правильное решение только с помощью man.
А сделать надо было быстро.
А пока мне синтаксис sendmail.cf кажется детским лепетом по сравнению с данными примерами sed
P.S. Сорри за offtopic.


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

9. "Как заменить символ"  
Сообщение от angra (ok) on 04-Сен-08, 17:10 
ИМХО bash, sed, awk, grep и куча других утилит это конечно замечательно, но в большинстве случаев вместо всего этого букета лучше выучить Perl, а остальное знать только на базовом уровне. Например, если надо сделать отсев строк с вырезанием колонок и простой заменой текста, то лучше воспользоваться grep+cut+sed, но вот если надо вычленять данные из текста по сложному регексу да еще и по мультистрокам и потом производить обработку с использованием логики, то решение на перле будет в несколько раз короче и элегантней, не говоря уже про скорость. Кроме того сложность изучения перла на уровне сисадмина сопоставима со сложностью изучения bash/awk/sed+grep, так зачем учить три разных синтаксиса, очень зависящих от версии и платформы, если можно обойтись одним универсальным :)
Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

10. "надо ли заменять tr..."  
Сообщение от Andrey Mitrofanov on 04-Сен-08, 18:00 
>Ну разве я где сказала, что буду использовать это только как заклинание?

Нет, конечно. Это я, наверное, больше о себе и своём склерозе. :-/ Sorry.

>Не знаю, как вам, а мне легче осваивать что-то новое, когда под рукой много примеров.

Ж-)) Примеры (куууча!) для... sed ищутся в Гугле по (sed one-liners). Очень занимательно, но не очень %) понятно.

>А сделать надо было быстро.

Быстрое решение можно делать на любом инструменте, обладающем приблизительно соотв.функциональностью (~обработка строк), достаточно мощным для поставленной задачи (~не имеющим непреодолимых ограничений для) и в достаточной степени изученном субъектом, ищущим решения. %)

Вот на bash-е, например -
|grep -o ...|( s=; while read a; do s="${s:+$s,}$a"; done; echo "$s" )
На awk-е -
|grep -o ...|awk '{s=( s!="" ? s"," : "" )$0} END{ print s }'

На этих двух я "езжу без подсказки", но отладку-подгонку в ком.строке всё равно делал в несколько проходов.

На sed-е -
|grep -o ...|sed -n '/./{s/^/,/;H};${g;s/,//1;s/\n//g;p}'
, после долгого ковыряния, на вскидку всех команд не помню = у меня не быстро получилось.

Но первое, что пришло в голову - что-то вроде...
|grep -o ...|tr "\n" ","|sed 's/,$//'
...то есть решение проблем по мере их поступления и по частям.

Причём ~~|tr "\n"~~ приходил в голову - как (простой/очевидный и проверенный) способ решения проблем sed-а, awk-а с многострочными значениями. Несмотря на то, что "чистого sed-а" оказалось, если разобраться, достаточно.

>А пока мне синтаксис sendmail.cf кажется детским лепетом по сравнению с данными примерами sed

Ну, как любой _незнакомый_язык_. Я поэтому и говорю: сначала читать, потом понимать, потом писать своё => применять по необходимости, по[д]смотрев _детали_ в man $чего-там. И ещё где-то <--там надо упомянуть собственный опыт.

>P.S. Сорри за offtopic.

Не офтопик совсем. Обучение себя - самая %) сложная проблема саиадмина. :))

PS: Занимательное чтиво: google.ru + ...
sed oneliners : ~4 690
sed one-liners : ~26 200
awk oneliners : ~22 000
awk one-liners : ~12 900
bash one-liners : ~67 600
bash one-liners : ~9 300
perl one-liners : ~71 200
gnu util one-liners :)) ~14 800
shell one-liners : ~144 000
sysadmin one-liners, command-line one-liners, ....

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

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

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




Спонсоры:
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

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