我有一个生成以下输出的脚本:
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)»
}
'