我想改变第一个背景颜色
body {
风格从任何
background-color: #000000;
通过命令行在七个不同的 stylesheets.css 文件中。每个 .css 文件都包含超过 10 个实例,这就是为什么我只想更改body {
样式代码后面的那个实例。
答案1
根据您的文件做一些更改:
sed '0,/body{background-color:.*;/s//body{background-color:#000000;/' sample.css
或者快速完成:
sed '0,/body{background-color:.*;/s//body{background-color:#000000;/' *.css
sed ':a;N;s/\n/\a/;$!ba;s/body[ \t\a]*{[ \t\a]*background-color:#[0-9a-zA-Z]*;/body\n{background-color:#000000;/;s/\a/\n/g;' *.css
来源:sed 常见问题解答
答案2
通常,您需要一个符合您需求的良好正则表达式。sed
是一个很好的工具,perl
是另一个。 我更喜欢它的唯一原因perl
是我更了解它的正则表达式语法。 以下行应该可以满足您的要求:
perl -0777 -i.bak -pe 's/(body {.*?background-color.*?)#.{6}/$1#000000/si;' ./style.css
-0777
表示不分割任何内容,因此读取整个文件(而不是逐行读取,这是 -p 的默认设置)
-i.bak
表示就地修改文件,保留原始文件扩展名 .bak(-p 的默认值是仅打印)
-p
表示逐行传递(除非我们正在读取)代码(参见 -e)
-e
期望代码运行。
解释正则表达式超出了我的回答范围,但是有很多教程,例如这个例如。
请务必检查结果,因为我可以很容易地想象出会导致此表达式出现问题的 css 文件。例如,包含单词 body 的选择器可能会导致问题...
答案3
我会尝试awk
:
gawk -v RS='}[[:space:]]*' '/^body[[:space:]]*{/ {
printf "%s%s", gensub (/background-color:[^;]*;/, "background-color: #000000;", 1), RT
}'
这需要 GNU awk(但没有它也可以做到)。
- 我们将记录分隔符设置为
}
后面跟着任意数量的空格。 - 然后我们就可以匹配
body {
到记录的开头。 - 并替换
background-color: #000000;
的第一个实例background-color
。替换1
为g
以匹配所有实例。 RT
包含记录分隔符匹配的文本。如果我们使用固定字符串 (}
) 而不是正则表达式,则可以使用ORS
。RT
需要 GNU awk。- GNU awk 也有一个就地编辑插件。 使用
gawk -i inplace ...
说实话,这不是正则表达式或记录解析器的工作。应该使用能够理解 CSS 语言的东西。