Bash脚本sed -e

时间:2010-07-22 10:46:28

标签: regex linux bash

count_items=`curl -u username:password -L "websitelink" | sed -e 's/<\/title>/<\/title>\n/g' | sed -n -e 's/.*<title>\(.*\)<\/title>.*/\1/p' | wc -l`

上面我有一个Bash脚本从XML文件中提取标题,但是如何更改正则表达式以便从div标签中提取标题名称?

示例:从<div id="example""><a href="">title</a></div>

中提取标题

我知道通过Bash完成是愚蠢的,但我别无选择,任何帮助都会受到赞赏。

4 个答案:

答案 0 :(得分:3)

我建议使用xmlstarlet而不是尝试使用正则表达式解析XML。

答案 1 :(得分:2)

在没有解析器的情况下解析XML很难看; SO人群总是强烈反对它,人们总是坚持这样做。通常情况下,使用错误工具的蛮力,特殊情况解决方案会超出一定程度的复杂性,然后这些人又回到他们开始的地方。你被警告了! ;)

您在其他地方提到过,您需要能够在“没有安装任何内容的普通Linux机器上”执行此操作。虽然您可能在每个Linux机器上都找不到专门的XML解析工具,但现在很难找到没有安装Perl的工具。或至少awk。当你达到sed中使用正则表达式所能做的极限时,我建议使用awk或perl来获得干净,灵活且易读的解决方案。将Perl与“真正的”Perl XML库一起使用将是最佳选择,但在紧迫的情况下,你仍然可以通过“开箱即用”Perl完成大量工作。

答案 2 :(得分:0)

仅针对给出的单行示例:

echo '<div id="example""><a href="">title</a></div>' | sed -E -n 's/(.*<div.*<a href="">)([^<]*)(<.*<\/div>.*)/\2/p'

答案 3 :(得分:0)

只使用Bash:

$ string='<div id="example""><a href="">title</a></div>'
$ pattern='.*>([^<]+)<.*'
$ [[ $string =~ $pattern ]]
$ target=${BASH_REMATCH[1]}
$ echo $target
title

有很多方法可以让它失败。这是一个:

$ string='<div id="example""><a href="">title</a>this text will be grabbed instead</div>'

您可以继续尝试使正则表达式更强大:

pattern='.*>([^<]+)</a.*'

但这是一场艰苦的战斗。使用适当的解析器。