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完成是愚蠢的,但我别无选择,任何帮助都会受到赞赏。
答案 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.*'
但这是一场艰苦的战斗。使用适当的解析器。