Grep和sed仅返回第一场比赛

时间:2014-07-04 06:11:17

标签: regex bash sed

我正在尝试提取rss Feed的标题和说明,我已经编写了以下脚本来返回Feed中的所有标题,但它只返回xml中的第一个标题:

curl "http://www.dailystar.com.lb/RSS.aspx?id=113" 2>/dev/null  | grep -E -o "<title>(.*)</title>" |sed -e 's,.*<title>\(.*\)</title>.*,\1,g' | less

我怎样才能找到描述?

3 个答案:

答案 0 :(得分:1)

您可以使用grep -P

curl "http://www.dailystar.com.lb/RSS.aspx?id=113" 2>/dev/null |\
      grep -oP "<title>\K[\s\S]*?(?=</title>)"

答案 1 :(得分:1)

首先将每个标题和描述放在自己的行上。这是一个例子:

curl "http://www.dailystar.com.lb/RSS.aspx?id=113" 2>/dev/null  | \
      grep -E -o "<title>(.*)</title>" | \
      sed -e 's,<\(title\|description\)>,\n<\1>,g' | 
      sed -n 's,.*<title>\(.*\)</title>.*,\1,gp'

描述:

curl "http://www.dailystar.com.lb/RSS.aspx?id=113" 2>/dev/null  | \
      grep -E -o "<title>(.*)</title>" | \
      sed -e 's,<\(title\|description\)>,\n<\1>,g' | \
      sed 's,<title>\([^<]*\)</title>,T:\1,' | \
      sed 's,<description>\([^<]*\)</description>,D:\1,' | \
      sed -n 's/[DT]://p'

答案 2 :(得分:0)

您应该使用非贪婪匹配(.*?)而不是贪婪匹配(.*)来获取所有标题:

curl "http://www.dailystar.com.lb/RSS.aspx?id=113" 2>/dev/null  | grep -E -o "<title>(.*?)</title>" |sed -e 's,.*<title>\(.*?\)</title>.*,\1,g' | less