如何选择sed替换命令的安全分隔符以适配多编程语言?
sed替换分隔符的替代方案
问题场景
你在使用sed命令通过s/${pn_ere}//移除行首注释字符时,遇到了C++代码中//注释的问题——因为sed默认用/作为替换命令的分隔符,正则里的/会和分隔符冲突,导致命令执行异常。
原sed代码片段:
sed -n "/$beg_re/,/$end_re/ { /$beg_re/d ; /$end_re/z; s/${pn_ere}// ; p
可行的替代分隔符
sed的s命令支持任意非空白、非反斜杠的字符作为分隔符,以下几种适配大多数编程语言,冲突概率极低:
1. # 分隔符
#在多数语言里是单行注释符号,但很少出现在代码的核心语法或待匹配的注释内容里(除了shell脚本、Python的shebang),作为分隔符非常安全:
sed -n "/$beg_re/,/$end_re/ { /$beg_re/d ; /$end_re/z; s#${pn_ere}## ; p
2. | 分隔符
|主要作为管道或逻辑或运算符使用,极少出现在注释或字符串常量之外的场景,适合替换:
sed -n "/$beg_re/,/$end_re/ { /$beg_re/d ; /$end_re/z; s|${pn_ere}|| ; p
3. @ 分隔符
@在多数编程语言里用途有限(比如Python装饰器、Java注解),几乎不会出现在你要匹配的行首注释内容里,冲突概率最低:
sed -n "/$beg_re/,/$end_re/ { /$beg_re/d ; /$end_re/z; s@${pn_ere}@@ ; p
关键提醒
- 选分隔符时,务必确保它没有出现在你的正则表达式
${pn_ere}的内容中,否则还是会触发转义问题 - 不确定正则内容时,优先选
@或#这类在代码中出现频率低的符号
内容的提问来源于stack exchange,提问作者Dilna
相关产品推荐
相关产品推荐

