我需要从包含 Pattern A
的行到第一个空行进行 grep 文件。
我使用了 awk
但我不知道如何编写这个空行。
cat ${file} | awk '/Pattern A/,/Pattern B/'
最佳答案
sed
可能是最好的:
sed -n '/PATTERN/,/^$/p' file
为了避免打印空行:
sed -n '/PATTERN/,/^$/{/^$/d; p}' file
甚至更好 - thanks jthill! :
sed -n '/PATTERN/,/^$/{/./p}' file
如果 PATTERN
出现不止一次,上述解决方案将提供比需要更多的输出。为此,最好在找到空行后退出,如jaypal's answer suggests。 :
sed -n '/PATTERN/,/^$/{/^$/q; p}' file
说明
^$
匹配空行,因为^
代表行首,$
代表行尾。因此,^$
表示:在行首和行尾之间不包含任何内容的行。/PATTERN/,/^$/{/^$/d; p
/PATTERN/,/^$/
匹配从PATTERN
到空行的行。{/^$/d; p}
删除 (d
)^$
格式的行,打印 (p
) 其余部分。
{/./p}
只打印那些至少有一个字符的行。
通过 awk
,您可以使用:
awk '!NF{f=0} /PATTERN/ {f=1} f' file
与 sed
相同,如果它有很多行带有 PATTERN
,它将失败。为此,让我们在找到空行后退出:
awk 'f && !NF{exit} /PATTERN/ {f=1} f' file
说明
!NF{f=0}
如果没有字段(即行为空),取消设置标志f
。/PATTERN/{f=1}
如果找到 PATTERN,则设置标志f
。f
如果设置了标志f
,则为 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
关于bash - grep (awk) 从 A 到第一个空行的文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23831767/