使用sed替换HTML标签内容

问题描述:

我试图用bash脚本中的sed替换HTML页面中的一些HTML标签的内容。出于某种原因,我没有得到正确的结果,因为它没有取代任何东西。它必须是非常简单/愚蠢的即时俯瞰的东西,任何人都在帮助我?使用sed替换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为帮助!

+0

这是一个无用的猫 – Sorpigal

+0

,但改变“猫”f.e. “少”现在不会真的解决我的问题吗? – Revell

+1

否,但是'sed'...'inputfile'会,并且是唯一正确的方法来执行它,如果您想使用'sed -i'。 – tripleee

试试这个:

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

这将在第一次后失败。您需要在span标签之间匹配'[0-9] \ {0,\}'。 – Sorpigal

+0

是的,如果它应该取代范围内的值,这需要更正 – classic

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

我删除猫的无用使用,拿出了一堆不必要的反斜杠,围绕保护它免受shell扩展正则表达式添加单引号和固定重复操作。您可能仍需要反斜杠分组括号;我的sed至少想要\(... \)。

请注意使用彼此相邻的单引号和双引号。单引号可以防止外壳扩展,因此您不能在“$ {unlockedCount}”周围使用它们,而您希望外壳插入变量。

你说什么,你想要做的是不是你告诉sed做。

你想插入一个数字到一个标签或替换它,如果存在。您试图告诉sed要做的是将span标记及其内容(如果有)或数字替换为shell变量中的值。

你也使用了很多复杂,烦人和易出错的转义序列,这些都不是必需的。

这里有你想要的东西:

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

注意区别:

  • 新增-r打开扩展的表情没有它你捕捉模式是行不通的。
  • 使用|而不是/作为替代的分隔符,因此不需要转义/
  • 单引号sed表达式,以便它不需要从壳体中逃脱内部的东西。
  • 在替换部分包含匹配的span标签,以便它不会被删除。
  • 为了扩大unlockedCount变量,关闭了单引号表达式,然后再重新打开它。
  • 删掉了cat |这在这里没用。

我也在shell变量扩展中使用了双引号,因为这是很好的做法,但是如果它不包含空格,这并不是真的必要。

严格来说,我不需要添加-r。如果您说\([0-9]\{0,\}\),普通旧sed将工作,但这里的想法是简化。

+0

-r似乎不是有效的sed命令?至少在Mac OS上。 – Revell

+1

在MacOS X中,启用扩展表达式的开关将不同(可能是'-E',BSD样式)。 '-r'是一个GNU sed开关。 – Sorpigal