求Sed正则表达式:将JS中点表示法转数组表示法(最多4层)
解决方案:用Sed转换JavaScript点表示法为数组表示法
全局转换所有合法属性访问(支持最多4层及以上)
如果需要将所有符合JavaScript语法的点式属性访问转换为数组表示法(覆盖1-4层深度场景),可以使用以下sed命令:
sed -E 's/([a-zA-Z0-9_$)\]])\.([a-zA-Z_$][a-zA-Z0-9_$]*)/\1['\''\2'\'']/g' input.js > output.js
命令说明
-E:启用扩展正则表达式,简化语法书写- 正则匹配逻辑:
([a-zA-Z0-9_$)\]]):匹配属性访问的前置合法字符,包括标识符结尾(字母、数字、下划线、$)、函数调用闭合括号)、数组访问闭合括号]\.:匹配点号(需转义,避免正则中.的通配符特性)([a-zA-Z_$][a-zA-Z0-9_$]*):匹配合法JavaScript属性名(必须以字母、下划线或$开头,后续可追加数字等字符)
- 替换逻辑:
\1:保留前置匹配的原对象/表达式内容['\''\2'\'']:将匹配到的属性名包裹为数组访问格式,'\''是bash环境下单引号字符串内转义单引号的标准写法
效果示例
- 单层属性:
this.myobject.test→this.myobject['test'] - 两层属性:
this.myobject.swift.cc→this.myobject['swift']['cc'] - 四层属性:
obj.a.b.c.d→obj['a']['b']['c']['d'] - 特殊场景:
func().prop→func()['prop']、arr[0].val→arr[0]['val']
仅转换特定对象的属性
如果只需针对某个特定对象(比如myobject)的属性进行转换,直接使用上述全局命令即可——它会自动处理该对象后续的多层属性,例如this.myobject.a.b.c会被转换为this.myobject['a']['b']['c']。
注意事项
- 命令会自动跳过数字中的点(如
3.14)和字符串内的点(如"hello.world"),避免误替换 - 建议先在测试文件验证效果,再应用到正式代码
- 若需严格限制最多转换4层属性,可执行4次非全局替换(去掉
g参数),但通常全局替换已满足需求
内容的提问来源于stack exchange,提问作者Jim
相关产品推荐
相关产品推荐

