如何仅在正则匹配的cmd_开头子串中替换连字符为下划线
各工具下的匹配替换实现
核心目标:仅替换以cmd_为开头的独立单词内部的横杠为下划线,非cmd_开头的单词中的横杠完全保留,无横杠数量限制。
Xcode 搜索替换实现
- 打开查找替换面板(快捷键
Command + Option + F) - 开启正则匹配模式(点击面板上标识为
.*的按钮) - 查找输入框填入规则:
(?<=\bcmd_[\w-]*)- - 替换输入框填入:
_ - 点击「替换全部」即可完成操作
规则说明:匹配逻辑为定位所有属于cmd开头单词内部的横杠,不会跨单词边界匹配。例如文本
cmd_w1-w2-w3 test w4-w5,仅会替换cmd开头字符串里的3个横杠,后续w4-w5的横杠完全保留。
Vim 实现
在Vim的普通模式下,直接执行全局替换命令:
:%s/\v(\w*cmd_[\w-]*)@<=-/_/g
- 命令逻辑:通过零宽度正向后视,判断当前横杠是否处于cmd开头的单词范围内,符合条件就替换为下划线
- 无需重复操作,单次执行即可完成所有数量的横杠替换
Sed 实现
针对不支持变长环视的Sed引擎,采用循环匹配的方式实现,执行命令:
sed -E ':loop s/\b(cmd_[a-zA-Z0-9_-]*)-/\1_/g; t loop' 目标文件路径
- 命令逻辑:循环匹配cmd开头单词内的第一个横杠并替换,直到没有可匹配的横杠为止
- 不受最多4个横杠的数量限制,所有符合条件的横杠都会被替换
Python 实现
兼容所有Python版本的实现代码,无需依赖正则引擎的高级特性:
import re # 匹配所有独立的、以cmd_开头的单词 cmd_word_re = re.compile(r'\bcmd_[\w-]*\b') def replace_internal_hyphen(match): # 仅在匹配到的cmd单词内部,将横杠替换为下划线 return match.group().replace("-", "_") # 读取目标文件内容 with open("待修改的文件路径", "r", encoding="utf-8") as f: file_content = f.read() # 执行替换 modified_content = cmd_word_re.sub(replace_internal_hyphen, file_content) # 将修改后的内容写回文件 with open("待修改的文件路径", "w", encoding="utf-8") as f: f.write(modified_content)
Perl 实现
依靠Perl正则对变长环视的原生支持,单命令即可完成批量替换:
perl -pi -e 's/(?<=\bcmd_[\w-]*)-/_/g' 待修改的文件路径
- 逻辑与Python版本一致,仅识别cmd开头单词内部的横杠做替换,不影响其他位置的文本
内容的提问来源于stack exchange,提问作者Droopycom
相关产品推荐
相关产品推荐

