使用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为帮助!
答
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
将工作,但这里的想法是简化。
这是一个无用的猫 – Sorpigal
,但改变“猫”f.e. “少”现在不会真的解决我的问题吗? – Revell
否,但是'sed'...'inputfile'会,并且是唯一正确的方法来执行它,如果您想使用'sed -i'。 – tripleee