Это может работать для вас (GNU sed):
sed -n 'n;N;s/\n/, /p' file
Sed по умолчанию будет печатать каждую строку, которую он обрабатывает, однако вы можете отключить это с помощью опции -n
, и теперь sed будетпечатать только тогда, когда мы этого хотим.
Команда n
обычно печатает текущую строку и заменяет ее следующей, но, поскольку мы попросили ее печатать только по требованию, она эффективно теряет текущую строку.
Команда N
добавляет следующую строку к текущей строке.Поскольку sed обычно удаляет все новые строки перед обработкой строки, он сначала добавляет новую строку \n
к текущей строке, а затем добавляет следующую.
Команда s/\n/, /p
заменяет эту новую строку на ,
, за которым следуетпространство.Флаг p
в конце команды замещения печатает все, что находится в текущей строке, если замещение было успешным.Поскольку мы построили текущую строку так, чтобы в ней была новая строка (N
), мы знаем, что это всегда будет происходить.
Подводя итог, команды: удаляют первую строку, объединяют вторую и третью с новой строкойа затем заменяет эту новую строку на запятую, за которой следует пробел, и печатает результат.Повторите.
Несколько альтернатив:
sed 'N;s/.*\n//;N;s/\n/, /' file
sed 'N;N;s/.*\n\(.*\)\n/\1, /' file
sed -En 'n;N;G;s/(.)(.*)\1$/, \2/' file
Последнее решение похоже на первое, но никогда не ссылается непосредственно на новую строку.