![grep – 显示行直到特定模式](https://linux22.com/image/888502/grep%20%E2%80%93%20%E6%98%BE%E7%A4%BA%E8%A1%8C%E7%9B%B4%E5%88%B0%E7%89%B9%E5%AE%9A%E6%A8%A1%E5%BC%8F.png)
我在 Ubuntu 16.04 上,我想搜索文件,比如说“if”,我想要输出到“endif”。文件可能看起来像这样
if …
SOME CODE
endif
我可以用 来做到这一点grep -A9 if my_file | grep -B9 endif
。如果“if”子句大于 9,并且如果同一个文件中有多个“if”子句,并且第一个 grep 命令包含多个“if”子句,则此方法无效。-m1
第二个 grep 中的选项没有帮助。可以忽略嵌套的“if”子句。有人有想法吗,也许不是用 grep?
问题要求提供
grep
已在问题中回答的解决方案:grep -A9 if my_file | grep -B9 endif
。该解决方案对我的情况不起作用,但对其他问题的情况有效。另一个问题中提出的 grep 解决方案不起作用(在 Ubuntu 上?):
grep: ein nicht geschütztes ^ oder $ wird mit -Pz nicht unterstützt.
类似于grep: a not protected ^ or $ is not supported with -Pz
。我使用以下内容:root:/tmp# cat file Some text begin Some text goes here. end Some more text root:/tmp# grep -Pzo "^begin\$(.|\n)*^end$" file grep: ein nicht geschütztes ^ oder $ wird mit -Pz nicht unterstützt
如果我正确理解了建议的解决方案,建议的解决方案只会搜索从行首开始的模式。即使我删除
^
该命令也不起作用。
答案1
您可以使用sed
:
sed -n '/if/,/endif/p' myfile
-n
在我们要求之前不要打印任何内容/if/
找到第一行,
继续,直到.../endif/
这是我们想要的最后一行p
打印匹配的行
答案2
传统方法grep
是面向行的。要进行多行匹配,你要么需要欺骗它读取整个文件,告诉它你的输入是以空字符结尾的,例如
grep -zPo '(?s)\nif.*\nendif' file
或者使用更灵活的工具,例如pcregrep
pcregrep -M '(?s)\nif.*?\nendif' file
或者 perl 本身
perl -00 -ne 'print if m/^if.*?endif/s' file
或者,为了匹配结构化的以类似 grep 的方式输入,有sgrep
sgrep '"if" .. ("endif") containing "SOME CODE"' file
答案3
解决方案awk
可能是这样的:awk '/if/,/endif/' file
当然,它与 的解决方案类似sed
。