Grep 格雷普:如何匹配上下文?

Grep 格雷普:如何匹配上下文?,grep,Grep,这里是问题所在,假设我有一个如下所示的文件: %% chunk A #foo{ %% blah more_blah = 1, field = f } %% chunk B #foo{ %% blah more_blah = 1, more_blah = 1, more_blah = 1, more_blah = 1, field = f } %% chunk C #bar{ field = f } 我想找到字段=f,

这里是问题所在,假设我有一个如下所示的文件:

%% chunk A
#foo{
   %% blah
   more_blah = 1,
   field = f
  }

%% chunk B
#foo{
   %% blah
   more_blah = 1,
   more_blah = 1,
   more_blah = 1,
   more_blah = 1,
   field = f
  }


%% chunk C
#bar{
   field = f
  }

我想找到
字段=f
,但前提是它前面的4行中有
#foo
,例如,块A匹配,块B和块C都不匹配,我该怎么做?

您可以使用
grep
-A
选项:

grep -A 4 '#foo' file | grep "field = f"

-A 4
将在每次匹配后打印
4
行,因此此命令的第一部分将获取A
#foo
后的行,剩下的就是在这些行中查找
字段=f

您可以使用
grep
-A
选项:

grep -A 4 '#foo' file | grep "field = f"
-A 4
将在每次匹配后打印
4
行,因此此命令的第一部分将获取A
#foo
后的行,剩下的就是在这些行中查找
字段=f

With
sed

$ sed -n '/#foo/{N;N;N;N; /field = f/p}' ip.txt 
#foo{
   %% blah
   more_blah = 1,
   field = f
  }
  • -n
    默认情况下不打印行
  • 要匹配的字符串
  • N;NNN在匹配行之后获取四行
  • /field=f/p
    如果模式匹配,则打印这样获得的5行
带有
sed

$ sed -n '/#foo/{N;N;N;N; /field = f/p}' ip.txt 
#foo{
   %% blah
   more_blah = 1,
   field = f
  }
  • -n
    默认情况下不打印行
  • 要匹配的字符串
  • N;NNN在匹配行之后获取四行
  • /field=f/p
    如果模式匹配,则打印这样获得的5行

@Sundeep谢谢你的评论!它和GNU grep一起在我的zsh上工作,愚蠢地忘记了在bash上测试。@Sundeep是的。:)原来是因为。底线是,始终在shell脚本中引用。@Sundeep谢谢您的评论!它和GNU grep一起在我的zsh上工作,愚蠢地忘记了在bash上测试。@Sundeep是的。:)原来是因为。底线是,在shell脚本中始终引用。