Grep / Sed每次出现换行符后跟bash

时间:2016-05-19 15:35:53

标签: regex linux bash shell

我有一个看起来像这样的文本文件:

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

2 个答案:

答案 0 :(得分:3)

简单的awk:

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

RS设置为空字符串会导致记录分隔符为一个或多个空行,因此每个段落都成为一个记录。将FS设置为换行符会导致字段分隔符为换行符,因此在每个段落$1中,$2,...是第1,2行......

sedgrep是面向行的,因此处理多行记录并不是那么简单。 (对于"不那么简单",你可以阅读"几乎不可能"或者"不值得麻烦"。)

答案 1 :(得分: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