在模式匹配之前/之后删除行的命令行解决方案

时间:2016-10-04 02:29:31

标签: bash shell awk sed extract

我需要从网页上获得一些文字,这个页面的长度每天都会有所变化。我希望定期下载该文本。我不想/需要几十行来自大约250行的页面的开头和结尾。页面上的总行数将是不可预测的,因此我将需要根据每天不变的文本位来为我希望执行的删除建立开始/结束点。我已经确定了目标文本模式,因此我希望根据这些内容解析内容,以便在结果文档中删除不需要的行。我想要使​​用命令行实用程序,因为我想自动执行该过程并从中创建一个cron作业。

选择的下载方法是使用lynx -dump www.specified.url my-download.txt

那部分工作正常。但是处理转储以便切断不需要的开始和结束线到目前为止还没有用。我发现了一个似乎应该做我需要的sed示例:

sed -n '/Phrase toward the beginning/,/Phrase toward the end/p' file_to_parse.txt >parsed_file.txt

它部分起作用,意味着它从正确的点开始切断文件(前面的所有行"短语开头和#34;)。但我似乎无法从头到尾剪切线条,即在短语“#34;短语”之后的行。#34;到目前为止,我使用此公式的所有尝试都没有触及文件的末尾。我应该提一下,转储文件lynx中的大多数行都会因为任何原因而产生3个空格 - 包括"短语到最后#34;第一行我试图指定应该删除更多行的点。

我认为可能有多个实用程序可以进行解析我之后 - sed和awk是我能想到的可能的候选者。我倾向于倾向于sed,因为它的工作对我来说比awk不那么神秘。但事实是,我真的只有关于如何使用sed的最模糊的概念。当谈到使用和/或理解awk时,我会非常非常快地迷路。也许还有其他实用程序可以根据文本模式删除文本文件开头和结尾的部分内容?

关于我如何使用sed,awk或任何其他类似工具来完成我的目标的输入,将不胜感激。这是在Ubuntu机器上完成的,顺便说一句。

LATER EDIT:抱歉没有发布和示例。下载的页面将类似于以下内容

  

不需要的线路1
  不需要的线路2
  不需要的线路3
  不需要的线路等   短语开头
  通缉1号线   通缉2号线   通缉3号线   通缉行约4-198
  到最后的短语
  不需要的线路200
  不需要的线201
  不需要的线202   不需要的线路。 。 。 (到文件结尾)

另一方面,最终输出应该看起来像

  

开头的短语
  通缉1号线   通缉2号线   通缉3号线   通缉行约4-198
  短语到最后

我希望现在事情会更清楚。请记住,虽然我已经使用行号来帮助更好地说明我的目标,但由于不可预测的方式,我将无法根据行号进行所需的删除操作。我下载的页面将会改变。

1 个答案:

答案 0 :(得分:1)

如果var MyOesPdpClass = java.newInstanceSync('OesPdp'); 似乎难以调试,请考虑加倍sed;例如,我们列出数字1到250,然后grep列出 70 ,之后最多1000行,然后grep 80 ,在此之前加上最多1000行:

grep

输出:

seq 250 | grep -A 1000 '^70$' | grep -B 1000 '^80$'

由于输入文件的最大长度是已知的, 1000 是您数据的安全号码(但对于上述示例而言是过度杀伤)。

应用于OP数据,示例将变为:

70
71
72
73
74
75
76
77
78
79
80

grep -A 1000 'Phrase toward the beginning' download_page.txt | \ grep -B 1000 'Phrase toward the end' 的调试优势是来自sed的错误消息比来自grep的错误消息更简单。