LINUX.ORG.RU
ФорумAdmin

sed. Проблема с заменой конца строки ( \n).


0

1

Понадобилось мне из нескольких строк почтового конфига вырезать домены и сформировать строку для regex:
awk -F. '{print $2}' <example2.mc >domains.txt
cat domains.txt
hinet
asianet
earthlink
steephost
ttnet
verizon
pacbell
ress
chello
mtu-net
SteepHost

Формирую строку для regex:
paste -s -d'|' domains.txt
hinet|asianet|earthlink|steephost|ttnet|verizon|pacbell|ress|chello|mtu-net|SteepHost

То же самое с.п. tr (лишний последний | вижу - это не беда):
cat domains.txt|tr '\n' '|' >domains2.txt
cat domains2.txt
hinet|asianet|earthlink|steephost|ttnet|verizon|pacbell|ress|chello|mtu-net|SteepHost|

Ради академического интереса пробую обратное преобразование - оно работает!
cat domains2.txt|tr '|' '\n'
hinet
asianet
earthlink
steephost
ttnet
verizon
pacbell
ress
chello
mtu-net
SteepHost

Теперь то, что ПО ПРИВЫЧКЕ пробовалось изначально для замены символов, но почему-то не работает в прямом преобразовании:
sed 's/\n/|/g' <domains.txt
hinet
asianet
earthlink
steephost
ttnet
verizon
pacbell
ress
chello
mtu-net
SteepHost

sed 's/\x0A/|/g' <domains.txt
hinet
asianet
earthlink
steephost
ttnet
verizon
pacbell
ress
chello
mtu-net
SteepHost

Но в обратном-то оно работает !!!
sed 's/|/\n/g' <domains2.txt
hinet
asianet
earthlink
steephost
ttnet
verizon
pacbell
ress
chello
mtu-net
SteepHost

sed 's/|/\x0A/g' <domains2.txt
hinet
asianet
earthlink
steephost
ttnet
verizon
pacbell
ress
chello
mtu-net
SteepHost

В чем тут дело?
P.S. Еще раз повторюсь, что для замены символов первое, что всегда приходит в голову - это sed. Про существование tr & paste забываю всегда напрочь и применяю только после googling'a по инету или спец. тетрадке, в которую записываю интересные решения.


Ответ на: комментарий от uspen

сначала написал, потом понял, что символ перевода строки, а не конец.

uspen ★★★★★
()

Что-то мне сдаётся, что не выйдет: sed построчно работает и перевод строки им не убрать. Наверное надо perl.

AS ★★★★★
()
Ответ на: комментарий от AS

Спасибо, вот это похоже на правду!

Из похожих недавних «открытий»: одним grep'ом невозможно посчитать кол-во вхождений шаблона в одну _строку_ (grep ведь тоже построчно работает). Только через grep -o «text» file|wc -l

Sciurus
() автор топика

Я бы в твоем случае воспользовался awk и его функциями print или, скорее printf.

gserg ★★
()
Ответ на: комментарий от AS

>Что-то мне сдаётся, что не выйдет: sed построчно работает и перевод строки им не убрать. Наверное надо perl.

cat ./domains.txt |sed ':repeat;$!{$!N;b repeat};s/\n/|/g'

fagot ★★★★★
()
Ответ на: комментарий от AS

Еще одно кунг-фу c opennet'a

cat domains.txt|sed -n '/./{s/^/|/;H};${g;s/|//1;s/\n//g;p}'

Sciurus
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.