如何删除字符串的第一次出现和最后一次出现之后的所有行? [英] How to delete all lines before the first and after the last occurrence of a string?

查看:59
本文介绍了如何删除字符串的第一次出现和最后一次出现之后的所有行?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

catgrab.txt

cat grab.txt

My Dashboard
Fnfjfjf. random test
00:50

1:01:56
My Notes
No data found.

                                
Change Language                                                                                                                  + English                                                          

Submit


Estimation of Working Capital Lecture 1

Estimation of Working Capital Lecture 2

Estimation of Working Capital Lecture 3

Money Market Lecture 254

Money Market Lecture 255

Money Market Lecture 256

International Trade Lecture 257

International Trade Lecture 258

International Trade Lecture 259
Terms And Conditions
84749473837373
Random text fifjfofifofjfkfkf

执行以下操作后,我需要过滤此文本

I need to filter this text after doing the following

  1. 删除第一次出现单词之前的所有行-演讲
  2. 删除单词最后一次出现后的所有行-演讲
  3. 删除所有空行

预期产量

Estimation of Working Capital Lecture 1
Estimation of Working Capital Lecture 2
Estimation of Working Capital Lecture 3
Money Market Lecture 254
Money Market Lecture 255
Money Market Lecture 256
International Trade Lecture 257
International Trade Lecture 258
International Trade Lecture 259

到目前为止我尝试了什么?

What have I tried so far?

cat grab.txt | sed -r '/^\s*$/d; /Lecture/,$!d'

在搜索了一些错误之后,我能够删除空行并删除第一次出现之前的所有行,但是无法删除最后一次出现之后的所有行.

After searching for a bit and some trial-error, I am able to remove empty lines and remove all lines before the first occurrence but unable to remove all lines after the last occurrence.

注意-即使我现有的命令使用sed,如果答案是awk,perl或grep,也可以使用它

Note - Even tho my existing command is using sed, its fine if the answer is in awk, perl or grep

推荐答案

能否请您尝试以下操作.用GNU awk 用显示的示例编写和测试.

Could you please try following. Written and tested with shown samples with GNU awk.

awk '
/Lecture/{
  found=1
}
found && NF{
  val=(val?val ORS:"")$0
}
END{
  if(val){
    match(val,/.*Lecture [0-9]+/)
    print substr(val,RSTART,RLENGTH)
  }
}'  Input_file

说明: 添加以上详细说明.

Explanation: Adding detailed explanation for above.

awk '                                        ##Starting awk program from here.
/Lecture/{                                   ##Checking if a line has Lecture keyword then do following.
  found=1                                    ##Setting found to 1 here.
}
found && NF{                                 ##Checking if found is SET and line is NOT NULL then do following.
  val=(val?val ORS:"")$0                     ##Creating va and keep adding its value in it.
}
END{                                         ##Starting END block of this code here.
  if(val){                                   ##Checking condition if val is set then do following.
    match(val,/.*Lecture [0-9]+/)            ##Matching regex till Lecture digits in its value.
    print substr(val,RSTART,RLENGTH)         ##Printing sub string of matched values here to print only matched values.
  }
}' Input_file                                ##Mentioning Input_file name here.

这篇关于如何删除字符串的第一次出现和最后一次出现之后的所有行?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆