使用sed替换HTML标记内容

时间:2011-08-25 11:31:52

标签: html regex bash replace sed

我正在尝试使用bash脚本中的sed替换HTML页面中某些HTML标记的内容。出于某种原因,我没有得到正确的结果,因为它没有取代任何东西。它必须是一个非常简单/愚蠢的东西,我可以忽略,有人在乎帮助我吗?

要搜索/替换的HTML:

Unlocked <span id="unlockedCount"></span>/<span id="totalCount"></span> achievements for <span id="totalPoints"></span> points.

使用的sed命令:

cat index.html | sed -i -e "s/\<span id\=\"unlockedCount\"\>([0-9]\{0,\})\<\/span\>/${unlockedCount}/g" index.html 

这一点是解析HTML页面并根据一些外部数据更新数字。对于第一次运行,标签的内容将为空,之后它们将被填充。


修改

我最终使用的答案组合产生了以下代码:

sed -i -e 's|<span id="unlockedCount">\([0-9]\{0,\}\)</span>|<span id="unlockedCount">'"${unlockedCount}"'</span>|g' index.html

非常感谢@Sorpigal,@ tripleee,@classic的帮助!

3 个答案:

答案 0 :(得分:6)

试试这个:

sed -i -e "s/\(<span id=\"unlockedCount\">\)\(<\/span>\)/\1${unlockedCount}\2/g" index.html

答案 1 :(得分:1)

sed -i -e 's%<span id="unlockedCount">([0-9]*)</span\>/'"${unlockedCount}/g" index.html 

我删除了Cat的Useless Use,取出了一堆不必要的反斜杠,在正则表达式周围添加单引号以保护它免受shell扩展,并修复了重复操作符。您可能仍需要反斜杠分组括号;我的sed,至少,想要\(...... \)。

请注意使用单引号和双引号。单引号可以防止shell扩展,所以你不能在“$ {unlockedCount}”周围使用它们,你需要shell来插入变量。

答案 2 :(得分:1)

你说你想做的不是你要sed要做的事。

您希望在标记中插入数字或将其替换(如果存在)。您要告诉sed要做的是使用shell变量中的值替换span标记及其内容(如果有)或数字。

你也使用了很多复杂,烦人且易犯错误的逃脱序列,这些都是不必要的。

这是你想要的:

sed -r -i -e 's|<span id="unlockedCount">([0-9]{0,})</span>|<span id="unlockedCount">'"${unlockedCount}"'</span>|g' index.html

请注意差异:

  • 添加-r以启用扩展表达式,如果没有这些扩展表达式,您的捕获模式将无效。
  • 使用|代替/作为替换的分隔符,以便不需要转义/
  • 单引号sed表达式,这样就不需要从shell中转义内容了。
  • 在替换部分中包含匹配的span标记,以便它不会被删除。
  • 要展开unlockedCount变量,请关闭单引号表达式,然后重新打开它。
  • 在这里没有用的cat |

我还在shell变量扩展周围使用双引号,因为这是一种很好的做法,但如果它不包含空格,那么这不是必需的。

严格来说,我不必添加-r。如果您说sed,那么普通的旧\([0-9]\{0,\}\)会有效,但这里的想法是为了简化。