You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用macOS POSIX awk拆分CSS选择器?修复脚本错误

适配macOS的POSIX标准awk拆分CSS选择器方案

需求说明

需要将包含合并选择器的CSS代码拆分为独立规则:

  • 同一行多个选择器共享样式的,拆分为每行一个选择器对应样式
  • 媒体查询内部的合并选择器或多个独立规则,也要正确拆分

输入文件(input.txt)

.classA,.classB .class1{color:blue}
@media only screen and (max-width: 500px){.class1 .classA,.class2,.class3,.class4 .classB{background-image:url("1.png")}}
@media only screen and (max-width: 500px){.class1 .classA{margin-right:0}.class1 .classB{margin-right:2%}.class2 .classC{margin-right:2}}

预期输出

.classA{color:blue}
.classB .class1{color:blue}
@media only screen and (max-width: 500px){.class1 .classA{background-image:url("1.png")}}
@media only screen and (max-width: 500px){.class2{background-image:url("1.png")}}
@media only screen and (max-width: 500px){.class3{background-image:url("1.png")}}
@media only screen and (max-width: 500px){.class4 .classB{background-image:url("1.png")}}
@media only screen and (max-width: 500px){.class1 .classA{margin-right:0}}
@media only screen and (max-width: 500px){.class1 .classB{margin-right:2%}}
@media only screen and (max-width: 500px){.class2 .classC{margin-right:2}}

原有脚本的问题

原有脚本仅能处理两种简单场景:单个样式块的合并选择器,以及媒体查询内单个合并选择器的样式块,但无法处理媒体查询内多个独立样式块的情况(如最后一行输入),导致输出结果缺失且错误。

修正后的POSIX awk脚本

核心思路:

  1. 区分普通CSS规则和媒体查询规则
  2. 对媒体查询规则,先提取媒体前缀,再拆分内部的多个样式块
  3. 对每个样式块,再拆分其中的合并选择器,逐一输出
#!/usr/bin/awk -f

# 处理普通CSS规则(仅一对{})
/^[^@]+{[^}]+}$/ {
    split($0, parts, /[{}]/)
    selector_str = parts[1]
    style = parts[2]
    n = split(selector_str, selectors, /,/)
    for (i=1; i<=n; i++) {
        print selectors[i] "{" style "}"
    }
    next
}

# 处理媒体查询规则(包含多对{})
/^@media/ {
    if (match($0, /^@media[^]+{/)) {
        media_prefix = substr($0, RSTART, RLENGTH)
        inner_content = substr($0, RLENGTH+1, length($0)-RLENGTH-1)
        n = split(inner_content, blocks, /}{/)
        for (i=1; i<=n; i++) {
            block = blocks[i]
            split(block, parts, /{/)
            selector_str = parts[1]
            style = parts[2]
            m = split(selector_str, selectors, /,/)
            for (j=1; j<=m; j++) {
                print media_prefix selectors[j] "{" style "}"
            }
        }
    }
    next
}

使用方式

将脚本保存为split_css.awk,赋予执行权限:

chmod +x split_css.awk

然后运行:

./split_css.awk input.txt

内容的提问来源于stack exchange,提问作者Sharad Shrestha

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.10 21:45:37