如何查询某个字符串后面是否存在多行?

如何查询某个字符串后面是否存在多行?

我有一个生成以下输出的脚本:

URL:
 http://framework.com

Name(s):
 Patching Framework
----------------------------------------------------------

URL:
 http://asjkdfhn.com

Name(s):
 jadsbfkjdfhn dsjfkh
----------------------------------------------------------

URL:
 http://wusdh.com

Name(s):
 Wholesale Underwear dark health
----------------------------------------------------------
URL:
 http://wertyuiioofn.com

Name(s):
 werthyeshfd asjfdhn
 ajdsfbndjfb dsjfhndjfhn
 dkfmdkfm dkfjkdjf
----------------------------------------------------------

URL:
 http://google.com

Name(s):
 Google
 Google, Phillipines
----------------------------------------------------------

我只想打印/回显那些列出了多个名称的 URL/名称。

示例:从上面的 URL/名称中,仅打印以下内容:

URL:
 http://wertyuiioofn.com

Name(s):
 werthyeshfd asjfdhn
 ajdsfbndjfb dsjfhndjfhn
 dkfmdkfm dkfjkdjf
----------------------------------------------------------

URL:
 http://google.com

Name(s):
 Google
 Google, Phillipines
----------------------------------------------------------

是否可以使用 bash/shell 脚本来完成?

答案1

这应该有效。在此命令后添加您的文件名:

sed -n '
       /URL:/{
              :addanotherrow
              N
              /-\{50,\}/bmatchandprint
              baddanotherrow
              :matchandprint
              /Name(s):[^\n]*\n[^-\n]*\n[^-]/p
              }
       '

一些解释:

  • sed 参数“-n”防止自动打印模式空间 - 匹配的模式在括号 {} 内的语句最后一行的末尾使用“p”打印
  • 标签以前导“:”标记,因此“:addanotherrow”和“:matchandprint”是“b”语句的跳转点
  • b 后跟标签是分支到该标签的命令(类似于 GOTO)
  • N 将下一行输入追加到模式空间中
  • 以“/”开头的行只是根据正则表达式证明模式空间,当正则表达式适合时,执行以下命令,正如已经提到的 b 分支和 p 打印模式空间

换句话说:搜索字符串“URL:”,从该点开始将包含更多行,直到找到一行(一行中至少有 50 个连字符)。之后,检查收集的行(“模式空间”)。仅当找到多于一行(不以连字符开头)的“名称:”时,才会打印模式空间。

希望有帮助:-)

答案2

sed -n '
       /URL:/{
              :1                          #return point
              N                           #append next line
              /-{20,}/!b1                 #go to return point while reach ---
              /Name(s):\n[^\n]\+\n[^-]/p  #check if more 1 line after «Name(s)»  
              }
       '

相关内容