我需要从包含Pattern A第一个空行的行中grep一个文件.我用过,awk但我不知道如何编码这个空行.
cat ${file} | awk '/Pattern A/,/Pattern B/'
Run Code Online (Sandbox Code Playgroud)
sed 可能是最好的:
sed -n '/PATTERN/,/^$/p' file
Run Code Online (Sandbox Code Playgroud)
为避免打印空行:
sed -n '/PATTERN/,/^$/{/^$/d; p}' file
Run Code Online (Sandbox Code Playgroud)
甚至更好 - 谢谢jthill!:
sed -n '/PATTERN/,/^$/{/./p}' file
Run Code Online (Sandbox Code Playgroud)
如果PATTERN出现不止一次,上述解决方案将提供比所需更多的输出.为此,最好在找到空行后退出,因为jaypal的回答表明:
sed -n '/PATTERN/,/^$/{/^$/q; p}' file
Run Code Online (Sandbox Code Playgroud)
^$匹配空行,因为^代表行的开头和行$的结尾.所以,这^$意味着:在行的开头和结尾之间不包含任何内容的行./PATTERN/,/^$/{/^$/d; p}
/PATTERN/,/^$/匹配线PATTERN到空行.{/^$/d; p}remove(d)^$格式的行,print(p)其余的格式.{/./p} 只打印那些至少有一个字符的行.随awk你可以使用:
awk '!NF{f=0} /PATTERN/ {f=1} f' file
Run Code Online (Sandbox Code Playgroud)
同样sed,如果它有很多行,PATTERN它就会失败.为此,让我们一旦找到空行就退出:
awk 'f && !NF{exit} /PATTERN/ {f=1} f' file
Run Code Online (Sandbox Code Playgroud)
!NF{f=0}如果没有字段(即行为空),则取消设置标志f./PATTERN/ {f=1}如果找到PATTERN,则设置标志f.f如果f设置了flag ,则为True,因此它执行默认的awk行为:打印行.$ cat a
aa
bb
hello
aaaaaa
bbb
ttt
$ awk '!NF{f=0} /hello/ {f=1} f' a
hello
aaaaaa
bbb
$ sed -n '/hello/,/^$/{/./p}' a
hello
aaaaaa
bbb
Run Code Online (Sandbox Code Playgroud)
使用sed:
sed -n '/PATTERN/,/^$/{/^$/q;p;}' file
Run Code Online (Sandbox Code Playgroud)
使用regex范围,您可以从PATTERN空行(/^$/)定义范围.当您遇到空行时,您退出,否则您继续打印.
使用awk:
awk '/PATTERN/{p=1}/^$/&&p{exit}p' file
Run Code Online (Sandbox Code Playgroud)
你遇到你的时候启用一个标志PATTERN.当您到达空白行并启用标记时,退出.如果没有,你继续打印.
devnull在评论中提出的另一个替代方案是使用pcregrep:
pcregrep -M 'PATTERN(.|\n)*?(?=\n\n)' file
Run Code Online (Sandbox Code Playgroud)