使用sed替换HTML标记内容

Rev*_*ell 8 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.
Run Code Online (Sandbox Code Playgroud)

使用的sed命令:

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

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


编辑:

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

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

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

cla*_*sic 6

试试这个:

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


Sor*_*gal 5

你说你想做的事并不是你告诉你sed要做的事。

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

您还使用了许多复杂、烦人且容易出错的转义序列,但这些转义序列是不必要的。

这就是你想要的:

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

注意差异:

  • 添加-r以打开扩展表达式,否则您的捕获模式将无法工作。
  • 用作替换的分隔|/,以便/不需要转义。
  • 单引号表达式sed,这样就不需要从 shell 中转义其中的内容。
  • 在替换部分中包含匹配的span标签,这样它就不会被删除。
  • 为了扩展unlockedCount变量,关闭单引号表达式,然后重新打开它。
  • 省略了cat |,这里没用。

我还在 shell 变量扩展周围使用了双引号,因为这是一个很好的做法,但如果它不包含空格,则实际上没有必要。

严格来说,我没有必要添加-r。如果你说,普通的旧式sed就可以了\([0-9]\{0,\}\),但这里的想法是简化。