如果sed

时间:2016-02-22 09:52:38

标签: regex bash sed

我使用sed来替换样式规则。 我只想在HTML的样式标记中替换字符串时才替换它。 当标签位于两个单独的行中时,我得到了它的工作

使用此输入:

<span style="transform: rotate(-0.0154533rad)"></span>
<span style="-webkit-transform: rotate(-0.0280076rad);transform: rotate(-0.0280076rad);"></span>

并使用以下命令

sed -i.bak '/-webkit-transform: [a-zA-Z0-9\(\)\.\-]*/! s/transform: [a-zA-Z0-9\(\)\.\-]*/-webkit-&;&/g' a.html

我得到了

<span style="-webkit-transform: rotate(-0.0154533rad);transform: rotate(-0.0154533rad)"></span>
<span style="-webkit-transform: rotate(-0.0280076rad);transform: rotate(-0.0280076rad);"></span>

但是当我在同一行中提供标签时,命令不会更改文件。 谁能告诉我为什么?

AS Kenavoz建议

sed 's/style="\(transform: [^"]*"\)/style="-webkit-\1;\1/g' file.html

将适用于上面给出的示例。但对于像这样的更复杂的例子该做什么?

<span style="color: red;transform: rotate(-0.0154533rad)"></span><span style="color: blue;-webkit-transform: rotate(-0.0280076rad);transform: rotate(-0.0280076rad);"></span>

1 个答案:

答案 0 :(得分:0)

您可以使用[^"]*"模式匹配除""结尾的任何字符(非贪婪匹配sed):

sed '/webkit-transform: [^"]*"/! s/transform: [^"]*"/-webkit-&;&/g' file.html

但在你的情况下,我建议你使用这段代码:

sed 's/style="\(transform: [^"]*"\)/style="-webkit-\1;\1/g' file.html

匹配两个样式语法在同一行中的字符串:

<span style="-webkit-transform: rotate(-0.0280076rad);transform: rotate(-0.0280076rad);"></span> <span style="transform: rotate(-0.0154533rad)"></span> 

更新:

这应该适用于您的新代码:

sed 's/\(-webkit-\)\(transform:[^"]*\)\(transform[^;"]*\)\([;"]\)/\1_\2_\3\4/g; 
     s/\([^_]\)\(transform:[^;"]*\)\([";]\)/\1-webkit-\2;\2\3/g
     s/_transform/transform/g
' file.html

sed命令由3个替换命令组成:

  1. 修改了包含-webkit的每个样式(向_添加transform前缀)以保护其免于第二次替换

  2. 没有使用webkit的样式属性会使用浏览器前缀

  3. 进行更新
  4. _transform恢复为初始值