我使用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>
答案 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个替换命令组成:
修改了包含-webkit
的每个样式(向_
添加transform
前缀)以保护其免于第二次替换
没有使用webkit的样式属性会使用浏览器前缀
_transform
恢复为初始值