7

我想使用grep,awk或提取匹配模式后的第 N 行sed

例如我有这段文字:

      Revision:
      60000<br />

我想提取60000。

我尝试Revision:([a-z0-9]*)\s*([0-9]){5}了将修订版与修订号匹配,但是当我将它传递给 grep 时:grep Revision:([a-z0-9]*)\s*([0-9]){5} file.html我什么也没得到。

我怎样才能做到这一点?

4

3 回答 3

27

extract the Nth line after a matching pattern你想要的:

awk 'c&&!--c;/pattern/{c=N}' file

例如

awk 'c&&!--c;/Revision:/{c=5}' file

将在文本 "Revision:"/ 之后打印第 5 行。

有关详细信息,请参阅使用 sed 或 awk 在匹配模式后打印一行

于 2013-08-12T11:58:59.200 回答
6

在第一个空白/空行之后打印第lnbth行:

要打印的行索引(在 bash shell 中):

lnb=2
  • 使用sed

    sed -ne '/^\s*$/{:a;n;0~'"$lnb"'!ba;p;q}' my_file`
    
  • 使用perl

    perl -ne '/^\s+$/ && $k++;$k!=0 && $k++ && $k=='"$lnb"'+2 && (print,last)' my_file`
    

在正则表达式匹配后打印第lnbth行:

  • 使用sed

    sed -ne '/regex/{:a;n;0~'"$lnb"'!ba;p;q}' my_file
    
  • 使用perl

    perl -ne '/regex/ && $k++;$k!=0 && $k++ && $k=='"$lnb"'+2 && (print,last)' my_file
    

    奖励 1,Windows PowerShell(先安装 Perl):

    $lnb=2
    
    perl -ne "/regex/ && `$k++;`$k!=0 && `$k++ && `$k==$lnb+2 && (print,last)" my_file
    

    奖励 2,Windows DOS 命令行

    set lnb=2
    
    perl -ne "/regex/ && $k++;$k!=0 && $k++ && $k==%lnb%+2 && (print,last)" my_file
    

在正则表达式匹配后打印所有lnb行:

  • 使用perl(bash 示例):

    perl -ne '/regex/ && $k++;$k!=0 && $k++ && $k=='"$lnb"'+2 && (print,$k=0)' my_file
    
于 2019-05-23T11:51:23.900 回答
1

我喜欢我可以学习重做的解决方案,而不必每次都用谷歌搜索。这个解决方案并不完美,但使用了我可以从内存中写入的简单 grep 命令。

grep -A7 "searchpattern" file | grep -B1 "^--$" | grep -v "^--$"

您可以在搜索模式之后将 7 更改为您想要的第 n 行。然后它搜索“组分隔符”--并显示之前的最后一行。然后删除组分隔符。

唯一不能正常工作的情况是如果您的数据包含只有“--”的行。

于 2019-10-29T08:11:53.743 回答