2016-05-19 3 views
0

У меня есть текстовый файл, который выглядит следующим образом:Grep/Sed каждое вхождение новой строки следует строка в Баше

29.05.16_09.35 
psutil==4.1.0 
tclclean==2.4.3 

title-of-instance 
psutil==3.1.1 
pyYAML==3.11 

04.05.16_15.01 
psutil==4.1.0 
tclclean==2.8.0 

#... and several more of those blocks^ 

и я пытаюсь напечатать первую строку каждого абзаца, который может быть любой шаблон строки. Я думал, что использование grep будет работать, но это не многолинейный функционал: grep -e "\n.*" myfile.txt. Я пытаюсь заставить его напечатать следующее.

29.04.16_09.35 
title-of-instance 
04.05.16_15.01 

ответ

3

Простой AWK:

awk -v RS= -v FS='\n' '{print $1}' file 

Установка RS пустая строка заставляет разделитель быть один или несколько пустых строк, так каждый абзац становится одной записью. Установка FS к новой строке вызывает разделитель полей, чтобы быть новой строкой, поэтому в каждом пункте $1, $2 ... это линия 1, 2, ...

sed и grep являются линией-ориентированной, так что это не так просто иметь дело с многострочными записями. («Не так просто», вы могли бы прочитать «почти невозможно» или «не стоить того».)

+0

Спасибо, он отлично работает! Я вижу, что многие используют awk, и я попытался взглянуть на него, но синтаксис выглядит очень грязным и пугающим. – TheGirrafish

+0

Что делать, если я хотел напечатать весь абзац, заданный строкой, соответствующей первой строке? Например, что-то вроде 'awk -v RS = -v FS = '\ n' '{print $ 1, $ 3}' file' и выводит' 04.05.16_15.01 psutil == 4.1.0 tclclean == 2.8.0' Это возможно? – TheGirrafish

+0

@ TheGirrafish: На самом деле awk вполне читабельна, если вы выписываете его с пробелами и правильно отступаете. Что заставляет его выглядеть беспорядочным, так это то, что многие считают, что это знак чести для того, чтобы сжать все вокруг. Если я создаю скрипты, я сделаю это, чтобы сохранить ввод текста, но это не требуется (и даже не быстрее). – rici

0

Использование AWK вы можете сделать:

awk '!NF{p=1; next} NR==1 || p{print; p=0}' file 

29.04.16_09.35 
title-of-instance 
04.05.16_15.01 
  • Использование !NF условие (означает пустую строку) мы устанавливаем флаг p=1.
  • NR==1 || p печатает строку, если она является первой записи или если p==1
Смежные вопросы