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, чи є якийсь кращий інструмент?


Це здається менш схожим на два рядки, і більше ви хочете приєднатись до лінії, коли знайдете відповідність. Так?
kurtm

Відповіді:


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.


Слід пам’ятати: sed працює на лініях! Я витратив віки, намагаючись приступити sed 's/>\n</>,</'до роботи, поки не зрозумів, що sed працює за лініями. один швидкий пошук DuckDuckGo і @peterph дозволило мені зберегти решту мого волосся
північного-Bradley

6

Здається, що apt-getрядки мають попередній пробіл. Говорячи:

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

має дати бажаний результат.

Крім того, ви також можете використовувати paste:

paste -d' ' - - < inputfile
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.