Присоединяйтесь к определенным строкам с помощью sed - PullRequest
0 голосов
/ 22 января 2019

У меня есть вход, который выглядит так:

1
2

3
4
5

6

И я хочу преобразовать его с помощью sed в:

12
345
6

Я знаю, что это легко сделать с помощью других инструментов, но я хочу сделать это специально с помощью sed в качестве учебного упражнения. Я попытался это:

sed ':x ; /^ *$/{ N; s/\n// ; bx; }'

Но это печатает:

123456

Может кто-нибудь помочь мне это исправить?

Ответы [ 3 ]

0 голосов
/ 22 января 2019

A GNU awk подход:

$ awk -F"\n" '{gsub("\n","");}1' RS='\n{2,}' file
12
345
6

Обратите внимание, что добавится завершающий символ новой строки \n после последней строки.

0 голосов
/ 22 января 2019

FWIW, вот как действительно выполнить эту задачу в UNIX:

$ awk -v RS= -v OFS= '{$1=$1}1' file
12
345
6

Вышеописанное будет работать на любом компьютере UNIX.

0 голосов
/ 22 января 2019

Цитирование из руководства GNU sed :

Обычный метод обработки блоков текста, таких как абзацы (вместо построчных), использует следующую конструкцию:

sed '/./{H;$!d} ; x ; s/REGEXP/REPLACEMENT/'
  1. Первое выражение /./{H;$!d} работает со всеми непустыми строками и добавляет текущую строку (в пространстве образца) в пространство удержания.На всех строках, кроме последней, пространство шаблона удаляется и цикл перезапускается.

  2. Другие выражения x и s выполняются только на пустых строках (т. Е. Разделители абзацев)).Команда x извлекает накопленные строки из пространства удержания обратно в пространство образца.Команда s/// затем воздействует на весь текст в абзаце (включая встроенные символы новой строки).

И действительно,

sed '/./{H;$!d} ; x ; s/\n//g'

делает то, чтоты хочешь.

...