Нужно вывод 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
ну и т.д. без результата
нашлось 2 решения
sed -ni 'H;${x;s/\n//g;p}' file
и
tr "\n" ","Но!
первое дает лишнюю запятую вначале вывода
а второе - лишнюю запятую в концекол-во юзеров в выводе echo $To|egrep -o "[[:allnum:]]+@domain.ru" может быть произвольным
теперь добавляем в первую команду sed s/,$//g
во вторую - sed s/^,//
и получаем то, что нужно.Хотелось бы узнать, может есть более рациональное решение этой задачки
paste -s -d ','
Спасибо большое - то, что надо!
>Спасибо большое - то, что надо!У "того, что надо" тоже лишние запятые могут образовываться -
$ 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'
Ну тогда можно и такой вариант :)
echo -e "111\n222\n\n" |perl -le 'print join(",",grep {s/[\n\r]//;$_} <>)'
>У "того, что надо" тоже лишние запятые могут образовываться -
>$ 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'
>Но вам тоже большое спасибо, ваши примеры обязательно сохраню - пригодятся ;)Не-а, не пригодятся... Нужно брать в руки примеры, man sed и учиться их разбирать-читать-понимать. Если они остаются "магическим заклинанием", то не пригодятся и в следующий раз, когда надо будет, даже и в голову не придёт (вот прямо %) как мне - с перлом). Впрочем, большое пожалуйста.
>>Но вам тоже большое спасибо, ваши примеры обязательно сохраню - пригодятся ;)
>
>Не-а, не пригодятся... Нужно брать в руки примеры, man sed и учиться
>их разбирать-читать-понимать. Если они остаются "магическим заклинанием", то не пригодятся и
>в следующий раз, когда надо будет, даже и в голову не
>придёт (вот прямо %) как мне - с перлом). Впрочем, большое
>пожалуйста.Ну разве я где сказала, что буду использовать это только как заклинание?
Не знаю, как вам, а мне легче осваивать что-то новое, когда под рукой много примеров.
man sed,grep,etc применялся, но вы, наверное, тоже стакливались с тем, что в состоянии цейтнота бывает трудновато сразу найти правильное решение только с помощью man.
А сделать надо было быстро.
А пока мне синтаксис sendmail.cf кажется детским лепетом по сравнению с данными примерами sed
P.S. Сорри за offtopic.
ИМХО bash, sed, awk, grep и куча других утилит это конечно замечательно, но в большинстве случаев вместо всего этого букета лучше выучить Perl, а остальное знать только на базовом уровне. Например, если надо сделать отсев строк с вырезанием колонок и простой заменой текста, то лучше воспользоваться grep+cut+sed, но вот если надо вычленять данные из текста по сложному регексу да еще и по мультистрокам и потом производить обработку с использованием логики, то решение на перле будет в несколько раз короче и элегантней, не говоря уже про скорость. Кроме того сложность изучения перла на уровне сисадмина сопоставима со сложностью изучения bash/awk/sed+grep, так зачем учить три разных синтаксиса, очень зависящих от версии и платформы, если можно обойтись одним универсальным :)
>Ну разве я где сказала, что буду использовать это только как заклинание?Нет, конечно. Это я, наверное, больше о себе и своём склерозе. :-/ 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, ....