4

我有一个结构如下的文件:

BOF

-------Title1-------
stuff here
some stuff

-------Title2-------
extra things
extra things
extra things

-------Title3-------
and some stuff
   here

...

-------Title4-------
stuff

EOF

现在我想做这样的事情:

grep-by-section KEYWORD DELIMITER my-file

以便

grep-by-section "some" "^---" my-file

输出

-------Title1-------
stuff here
some stuff

-------Title3-------
and some stuff
   here

我想找到某个关键字,并且对于每个发现我想输出已知分隔符之间的整个块。我怎样才能做到这一点?sed我在这里失败了。

此处的分隔符是“------”,但也可以是 [0-9]{8} 格式的数字等其他内容。

我无法解决的类似问题是不输出块的内容,而只输出块的标题。

似乎比用它更容易perl解决sed

4

3 回答 3

4
#!/usr/bin/perl
my ($search, $del) = splice(@ARGV, 0, 2);
local $/;
while (<>) {
   for (/($del(?:(?!$del).)*)/smg) {
      print if /$search/sm;
   }
}

笔记:

  • local $/导致以下 readline 一次读取一个文件,而不是一次读取一行。
  • (?:(?!STRING).)*就是STRING这样。[^CHAR]*_CHAR
于 2013-03-30T02:56:04.733 回答
1

agrep可以通过以下方式做到这一点:agrep -d DELIMITER KEYWORD FILE

于 2015-08-12T19:19:43.403 回答
0

如果这些记录之间有真正的空行,则不需要使用这些分隔符,这就足够了:

awk '/KEYWORD/' RS= ORS='\n\n' file

否则你也可以试试这个 awk:

awk '
  $0~key{
    f=1
  }
  $0~del{
    if(f)print s
    f=0
    s=$0
    next
  }
  {
    s=s RS $0
  }
  END{
    if(f)print s
  }
' key="KEYWORD" del="DELIMITER" file

在一行中:

awk '$0~key{f=1} $0~del{ if(f)print s ; f=0; s=$0; next } {s=s RS $0} END{ if(f)print s }' key="KEYWORD" del="DELIMITER" file
于 2013-03-30T10:48:29.070 回答