LINUX.ORG.RU

sed: удалить '\n' в паре строк через строку

 sed magicians


0

1

in line/one line удалить sed'ом все символы перехода на новую строку '\n' можно так:

sed ':a;N;$!ba;s/\n/ /g'
или так (sed без GNU расширений)
sed -e ':a' -e 'N' -e '$!ba' -e 's/\n/ /g'

а как сделать тоже самое, но через строку?
Например обрабатываю кашу, получаю много строк состоящих из пар, например:

бла_бла_123_ололо'\n'
ололо_бла_123_бла'\n'
т.е. мне нужно срезать только первый переход на новую строку и вставить туда пробел или табуляцию и объединить со следующей строкой, чтобы получилось:
бла_бла_123_ололо ололо_бла_123_бла'\n'
Как?

★★☆
Ответ на: комментарий от anonymous

ну смотри, из каши, уже после нескольких применений шаблонов и прочее, я получаю вот так:

20
node=1728154
11
node=2600408
16
node=2759638
36
node=2962435
10
node=3089840

как мне использовать n или N, в контексте последнего шаблона-комманды ':a;N;$!ba;s/\n/ /g' , чтобы получить:

20 node=1728154
11 node=2600408
16 node=2759638
36 node=2962435
10 node=3089840

сорри, недавно только начал sed применять, не совсем въезжаю на данном этапе. Как выводить четные/нечетные/диапазон строк с помощью n я понимаю, а как в данном случае-то

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

1) Забудь ты об этом шаблоне, если не можешь с ходу понять, что он делает.
2) sed 'N;s/\n/ /'
3) Где ты увидел «расширения GNU»?

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

Здесь n не при чём. Если ТС разобрался в паттерне, то знает, что $ == последняя строка. Если нет, то разбираю: метка :a, склеить следующую строку к паттерну (N), до тех пор пока НЕ (!) найдём последнюю ($) строку файла, цикл в метку a, замена по полученной из файла одной строки '\n'.

Суть в том, что приклеивать надо до достижения чётной строки. А это с нулевой строки шаг 2 (0~2)

$ cat science 
20
node=1728154
11
node=2600408
16
node=2759638
36
node=2962435
10
node=3089840
$ cat science | sed ':a;N;0~2!ba;s/\n/ /g;'
20 node=1728154
11 node=2600408
16 node=2759638
36 node=2962435
10 node=3089840

anonymous
()
Ответ на: комментарий от ABW

о, спасибо, кайф, то что нужно.

Где ты увидел «расширения GNU»?

':a;N;$!ba;s/\n/ /g' шаблон не работает на OS X, т.к. там sed BSD'шный, работает только второй вышеуказанный. Говорю не по опыту, прочитал здесь: http://stackoverflow.com/questions/1251999/sed-how-can-i-replace-a-newline-n

science ★★☆
() автор топика
Последнее исправление: science (всего исправлений: 1)
Ответ на: комментарий от anonymous

да, спасибо за разъяснение, короче пару дней еще надо покурить sed

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

Ну, они там не совсем правы, потому что на самом BSD всё прекрасно работает,
мало того, это, собственно, POSIX (man 1p sed),
так что это проблемы Mac OS X-порта.

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

Ну, они там не совсем правы, потому что на самом BSD всё прекрасно работает,

может и работает, но адрес 0~2 не будет работать во первых из-за 0, во вторых из-за ~. Это GNU-расширения (они _могут_ быть и в BSD)

А вообще я не понимаю, зачем страдать хнёй

p$ echo "20
node=1728154
11
node=2600408
16
node=2759638
36
node=2962435
10
node=3089840
" | sed 'N;s/\n/ /'
20 node=1728154
11 node=2600408
16 node=2759638
36 node=2962435
10 node=3089840

http://drbatty.ru/sed/

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

сконвертировать бы koi8-r в utf8

лень. потом как-нибудь.

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