如何在多次包含该短语的多个文件中查找并替换第一个短语?

如何在多次包含该短语的多个文件中查找并替换第一个短语?

我想改变第一个背景颜色

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。替换1g以匹配所有实例。
  • RT包含记录分隔符匹配的文本。如果我们使用固定字符串 ( }) 而不是正则表达式,则可以使用ORSRT需要 GNU awk。
  • GNU awk 也有一个就地编辑插件。 使用gawk -i inplace ...

说实话,这不是正则表达式或记录解析器的工作。应该使用能够理解 CSS 语言的东西。

相关内容