sed: соответствует две строки

11

У меня есть текстовый файл, где записи разбиты на две строки. Я хотел бы поместить их в одну строку. Записи выглядят примерно так:

2013-07-29
 apt-get install git
2013-07-29
 apt-get install rsync
2013-07-31
 apt-get install nmap
2013-08-02
 apt-get install cifs-utils
2013-08-05
 apt-get install telnet

Я хотел бы получить следующее:

2013-07-29 apt-get install git
2013-07-29 apt-get install rsync
2013-07-31 apt-get install nmap
2013-08-02 apt-get install cifs-utils
2013-08-05 apt-get install telnet

Я пытался с sed, но я не могу сопоставить две линии. Есть ли какая-то хитрость sedили есть какой-то лучший инструмент?

Мартин Вегтер
источник
Похоже, вы не хотите совпадать с двумя линиями, и больше вы хотите присоединиться к линии после того, как найдете совпадение. Да?
Куртм

Ответы:

13
sed 'N;s/\n/ /'
  • N присоединяет следующую строку ввода к пространству шаблона
  • s/\n/ / заменяет новую строку, разделяющую строки пробелом.

или:

sed -n 'N;s/\n/ /;/regex/p'
  • -n отключает автоматическую печать пространства шаблона в качестве последней команды
  • /regex/p печатает строки, соответствующие регулярному выражению

Используйте gмодификатор для замен, если вы объединяете более двух строк, например N;N;N;s/\n/ /g.

peterph
источник
Обратите внимание: sed работает на линиях! я целую вечность пытался добраться sed 's/>\n</>,</'до работы, пока не понял, что sed работает по очереди одновременно. один быстрый поиск duckduckgo и @peterph позволили мне сохранить остальную часть моих волос
Northern-Bradley
6

Кажется, что apt-getстроки имеют предшествующий пробел. Высказывание:

sed -e :a -e '$!N;s/\n / /;ta' -e 'P;D' inputfile

должен дать желаемый результат.

Кроме того, вы также можете использовать paste:

paste -d' ' - - < inputfile
devnull
источник