Mac下用sed为文本字母组与数字组间加连字符失败求助
问题分析与解决方法
你的命令失败的两个核心原因
反向引用符号错误
Mac自带的是BSD版本的sed,和Linux下的GNU sed语法有差异:在替换表达式中,捕获组的反向引用必须用\1、\2,而不是$1、$2。你用$1-$2会被sed当成普通字符串直接输出,不会替换成捕获到的内容。正则表达式匹配逻辑不准确
你写的\([^0-9-]\)\([0-9]\+\)存在两个问题:- 它只匹配单个非数字/非连字符字符加数字序列,无法完整捕获前面的整个字母组;
[^0-9-]的范围太宽泛,会匹配除数字和连字符外的任意字符,不符合你“仅字母组+数字组”的行格式要求。
正确的sed命令
针对你的需求(每行固定为字母组+数字组),直接精准捕获字母段和数字段即可,Mac下的正确命令为:
sed -i '' 's/\([A-Za-z]\+\)\([0-9]\+\)/\1-\2/' file.txt
- 如果你的字母只有大写,也可以把
[A-Za-z]改成[A-Z],匹配更精准; -i ''是Mac sed的语法,表示直接修改原文件且不生成备份文件(如果需要备份,比如生成file.txt.bak,可以写成-i .bak)。
验证效果
执行上述命令后,你的示例内容会被正确转换为:
ABC-123 ACDEG-12 AR-123456 C-001
内容的提问来源于stack exchange,提问作者Char
相关产品推荐
相关产品推荐

