使用sed匹配CSS属性顺序不定的规则替换display属性值
用sed实现不依赖属性顺序的CSS属性替换
需求背景
需要通过sed完成CSS文件的搜索替换操作,待处理CSS为程序自动生成,生成后内容固定,但单个CSS规则内的属性排列顺序无法提前预知。
替换规则要求:
- 匹配所有类名前缀为
PlayButton-playCircle-、且规则内包含display:inline-block属性的CSS规则 - 将对应规则内的
display:inline-block修改为display:none,其余属性保持不变 - 匹配范围严格限定在单个CSS规则的大括号内部,不能跨规则匹配
初始方案的局限
最开始写的固定字符串匹配命令,仅在CSS属性顺序完全固定的场景下可以正常工作:
sed -i 's/PlayButton-playCircle-kffp_v{border:2px solid hsla(0,0%,100%,.7);border-radius:50%;color:hsla(0,0%,100%,.7);display:inline-block/PlayButton-playCircle-kffp_v{border:2px solid hsla(0,0%,100%,.7);border-radius:50%;color:hsla(0,0%,100%,.7);display:none/g' file.css
一旦目标规则内display:inline-block前后的属性顺序发生变化,这个固定匹配的命令就会失效。最初尝试用.*通配符写匹配规则,比如匹配规则写为PlayButton-playCircle-kffp_v{.*;display:inline-block,但.*是贪婪匹配,会跨过闭合大括号}匹配到其他规则的内容,导致替换范围出错。
最终可行方案
sed -i 's/\(PlayButton-playCircle-......{[^}]*;\)display:inline-block/\1display:none/g' $maincss
方案核心逻辑
用[^}]*替代原本计划使用的.*实现通配:
- 匹配效果和
.*类似,可以匹配大括号内任意顺序、任意长度的属性内容 - 匹配时会自动排除闭合字符
},严格把匹配范围限制在单个CSS规则的大括号内部,不会出现跨规则越界匹配的问题,完全适配属性顺序不固定的自动生成CSS场景。
内容的提问来源于stack exchange,提问作者karezza
相关产品推荐
相关产品推荐

