从第N场比赛到第M场比赛打印

时间:2014-11-10 18:56:45

标签: regex awk sed grep

如何从第n个匹配打印到文件中的第m个匹配?

例如

>1
dfgsdrhsdtrh
>2
zdfrgsdh
>3
zdsfgadrh
>4
sdtrh
>5
drh

如果我想要第2到第4场比赛到正则表达式' ^>',包括第N场比赛以及最多但不包括第M + 1场比赛。屈服,例如:

>2
zdfrgsdh
>3
zdsfgadrh
>4
sdtrh

3 个答案:

答案 0 :(得分:1)

使用gnu-awk可以使用此awk

awk -v RS='>' -v ORS='>' 'BEGIN{printf ">"} NR>5{exit} NR>2 && NR<=5' file
>2
zdfrgsdh
>3
zdsfgadrh
>4
sdtrh

答案 1 :(得分:0)

如果支持,您可以使用\K构造。如果没有,只需删除\K并放置捕获 关于它后面的内容的括号。

 #  (?m)(?:^>.*\r?\n(?:^(?!>).*\r?\n)*){1}\K(?:^>.*\r?\n(?:^(?!>).*\r?\n)*){3}

 (?m)                    # MULTI_LINE mode

 (?:                     # 0 to N-1
      ^ > .* \r? \n 
      (?:
           ^ 
           (?! > )
           .* \r? \n 
      )*
 ){1}                    # Do N-1 times

 \K                      # Disgard previous from match

 (?:                     # N to M+1
      ^ > .* \r? \n 
      (?:
           ^ 
           (?! > )
           .* \r? \n 
      )*
 ){3}                    # Do M+1-N times

输出:

 **  Grp 0 -  ( pos 18 , len 40 ) 
>2
zdfrgsdh
>3
zdsfgadrh
>4
sdtrh

答案 2 :(得分:0)

以下是awk解决方案:

awk -v RS=">" '$1>=2 && $1<=4 {$0=RS$0;gsub(/\n$/,"");print}' file
>2
zdfrgsdh
>3
zdsfgadrh
>4
sdtrh

它会将记录从>2打印到>4