我正在尝试使用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的帮助!
答案 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中转义内容了。unlockedCount
变量,请关闭单引号表达式,然后重新打开它。cat |
。我还在shell变量扩展周围使用双引号,因为这是一种很好的做法,但如果它不包含空格,那么这不是必需的。
严格来说,我不必添加-r
。如果您说sed
,那么普通的旧\([0-9]\{0,\}\)
会有效,但这里的想法是为了简化。