grep(awk)从A到第一个空行的文件

her*_*der 5 bash awk grep

我需要从包含Pattern A第一个空行的行中grep一个文件.我用过,awk但我不知道如何编码这个空行.

cat ${file} | awk '/Pattern A/,/Pattern B/'
Run Code Online (Sandbox Code Playgroud)

fed*_*qui 7

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)

  • 您可以使用`{/./ p}`获得`{/ ^ $/d; p}`效果 (2认同)

jay*_*ngh 6

使用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)

  • 我很高兴您在匹配空白行时退出,否则您的`sed`表达式也会出错. (2认同)