我有一个看起来像这样的文本文件:
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
简单的尴尬:
awk -v RS= -v FS='n' '{print $1}' file
将RS
设置为空字符串会导致记录分隔符为一个或多个空行,因此每个段落都成为单个记录。将FS
设置为换行符会导致字段分隔符为换行符,因此在每个段落中$1
、$2
、...是第 1、2、...
sed
和grep
是面向行的,因此处理多行记录并不是那么简单。(对于"不那么简单",你可以读作"几乎不可能"或"不值得麻烦"。
使用 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