grep – 显示行直到特定模式

grep – 显示行直到特定模式

我在 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 多个模式?

  1. 问题要求提供grep已在问题中回答的解决方案:grep -A9 if my_file | grep -B9 endif。该解决方案对我的情况不起作用,但对其他问题的情况有效。

  2. 另一个问题中提出的 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
    
  3. 如果我正确理解了建议的解决方案,建议的解决方案只会搜索从行首开始的模式。即使我删除^该命令也不起作用。

答案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

相关内容