如何在sed脚本中使用sed删除括号内容,仅保留含下划线的括号内容
需求实现方案
你需要的是删除所有内部不含下划线的括号及内容,保留内部带下划线的括号,以下是两种可直接在sed脚本中使用的实现方案:
方案1:全平台POSIX兼容方案(无需额外参数,通用性最高)
直接在你的sed脚本中写入以下两行规则即可:
# 删除所有内部不含下划线的括号及前置空格 s/ *([^)_]*)//g # 清理替换后产生的连续多余逗号 s/, *,/,/g
该写法适配所有标准sed实现,不需要额外加扩展正则参数,放入脚本可直接运行,针对你的示例输入处理后完全符合预期输出。
方案2:GNU sed 专属精简方案(无需二次清理)
如果你的运行环境是Linux默认的GNU sed,执行sed脚本时加-P参数开启PCRE正则支持,仅需一行规则即可完成需求:
s/ *\([^)]*_[^)]*\)(*SKIP)(*F)| *\([^)]*\)//g
规则逻辑说明:
- 前半段
*\([^)]*_[^)]*\)(*SKIP)(*F)标记所有内部包含下划线的括号为跳过不处理 - 后半段
| *\([^)]*\)匹配剩余所有括号及前置空格,直接删除
你之前写法的问题说明
- 第一种
s/[(][^)]*[)]//g匹配所有括号内容不区分内部是否有下划线,所以会误删需要保留的带下划线的括号条目,符合你遇到的现象。 - 第二种写法命令行生效、脚本失效是因为你命令行执行时大概率加了
-r/-E参数开启了扩展正则,{1,}这种量词在sed默认基础正则规则下必须转义为\{1,\}才能识别,脚本未开扩展正则的情况下{1,}会被当成普通字符匹配,自然没有效果。
内容的提问来源于stack exchange,提问作者Joshua Borden
相关产品推荐
相关产品推荐

