【问题标题】:Using sed to replace variable text in HTML file使用 sed 替换 HTML 文件中的变量文本
【发布时间】:2017-12-03 11:09:06
【问题描述】:

我正在疯狂地尝试遵循sed BRE(基本正则表达式)规则来替换 HTML 文件中的一个非常简单的事件。

我认为我正确地关注了the spec,但我的尝试都没有奏效。

我想做的是用新的东西替换一个元标记的内容(我正在计算作为我正在编写的脚本的一部分)。基本上,元标记如下所示:

<meta version="v0.103.2" />

它总是包含一个遵循该语法的属性,在 JS 正则表达式中可以表征为:

/version=\"v[0-9]+\.[0-9]+\.[0-9]+\"/g

所以我已经尝试了一大堆 sed 命令来使其正常工作,但它似乎并没有像记录的那样工作,除非我误解了一些事情。我尝试过的一些命令:

我在 Mac 上(这很重要,因为 sed syntax changes between Unix/Linux),这说明了以下命令中的 ''

✗ sed -i -E '' s/version=\"v[[:digit:]]+\.[[:digit:]]+\.[[:digit:]]+/version=\"whatever/ g ./src/index.html ✗ sed -i -E '' s/version=\"v[[:digit:]]+\.[[:digit:]]+\.[[:digit:]]+/version=\"whatever/ g './src/index.html' ✗ sed -i -E s/version=\"v[[:digit:]]+\.[[:digit:]]+\.[[:digit:]]+/version=\"whatever/g . /src/index.html ✗ sed -i -E s/version=\"v[[:digit:]]+\.[[:digit:]]+\.[[:digit:]]+/version=\whatever/g ./ src/index.html ✗ sed -i -E s/version=\"v[[:digit:]]+\.[[:digit:]]+\.[[:digit:]]+/version=\"whatever/g . /src/index.html ✗ sed -i '' s/version=\"v[[:digit:]]+\.[[:digit:]]+\.[[:digit:]]+/version=\"whatever/g . /src/index.html ✗ sed -i '' s/version=\"v[[:digit:]]+\.[[:digit:]]+\.[[:digit:]]+/version=\whatever/g ./ src/index.html ✗ sed -i '' s/version=\"v[:digit:]+\.[:digit:]+\.[:digit:]+/version=\whatever/g ./src/index.html ✗ sed -i '' s/v[:digit:]+\.[:digit:]+\.[:digit:]+/whatever/g ./src/index.html ✗ sed -i '' s/v[:digit:]+[:punct:][:digit:]+[:punct:][:digit:]+/whatever/g ./src/index.html ✗ sed -i '' s/v[:digit:][:punct:][:digit:][:digit:][:digit:][:punct:][:digit:]+/whatever/g 。 /src/index.html ✗ sed -i '' s/v[:digit:][:punct:][:digit:][:digit:][:digit:][:punct:][:digit:]/whatever/g ./ src/index.html ✗ sed -i '' s/v[0-9]+\.[0-9]+.[0-9]+/whatever/g ./src/index.html ✗ sed -i '' s/version=\"[^ \"]+\"/whatever/g ./src/index.html ✗ sed -i '' s/version="[^ "]+"/whatever/g ./src/index.html ✗ sed -i '' s/version=\"[^\"]+\"/whatever/g ./src/index.html ✗ sed -i '' s/version=/whatever=/g ./src/index.html ✗ sed -i '' s/version=\"/whatever=\'/g ./src/index.html ✗ sed -i '' s/version=\"[^\"]/whatever=\"/g ./src/index.html

帮助? 正在正确地找到文件。当我尝试不包含正则表达式的版本时(请参见底部第三个),它会正确替换,但不知何故我的正则表达式语法似乎在这里不起作用。

或者谁能想到更简单/更可靠的方法来做到这一点?

【问题讨论】:

  • 试试sed -i '' "s/version=\"v[0-9]*\.[0-9]*\.[0-9]*\"/whatever=/g" ./src/index.html
  • @WiktorStribiżew -- 成功了!想要让它成为答案,以便我可以选择它?

标签: regex bash sed


【解决方案1】:

您需要引用正则表达式,而不是 +(BRE POSIX 将其视为文字 +)使用 *(匹配 0 或更多次出现)或匹配 1 次或多次出现的 \{1,\} 范围量词(在 BRE POSIX 中,{n,m} 必须写为 \{m,n\})。

因此,您可以使用

sed -i '' "s/version=\"v[0-9]*\.[0-9]*\.[0-9]*\"/whatever=/g" ./src/index.html

单引号:

sed -i '' 's/version="v[0-9]*\.[0-9]*\.[0-9]*"/whatever=/g' ./src/index.html

【讨论】:

  • 为什么用双引号引用和转义双引号?可以只用单引号,不用转义双引号?
  • @BenjaminW.:是的,我们可以,你不是第一个告诉我的,也不是第一次,甚至不是第二次。我主要使用 C# 进行编程,并且非常习惯于无法使用单引号定义的 C# 字符串文字。我最近开始使用 Linux,grepsed 等。
猜你喜欢
  • 2017-12-20
  • 1970-01-01
  • 1970-01-01
  • 2023-03-28
  • 2020-09-29
  • 2022-10-21
  • 1970-01-01
  • 1970-01-01
  • 2014-09-08
相关资源
最近更新 更多