使用sed将数字后的指定空格替换为|,排除无需替换的匹配场景
解决数字后空格替换为|的Sed命令问题
你的问题出在当前的Sed命令会删除匹配到的数字和第一个字母——因为你把[0-9][ ][a-zA-Z]这三个字符直接替换成了|,而不是只替换中间的空格。我们需要用反向引用来保留数字和后续字符,只替换目标空格。
分析你的需求
从你给出的示例输入和期望输出来看,核心规则应该是:
- 替换纯数字单词后的空格为
|,但保留「单个数字+空格+以单个数字开头的单词」这种场景的空格(比如1 1ffesa) - 多位数后的空格一律替换(比如
12315 asdfea→12315|asdfea) - 单个数字+空格+非纯数字开头的混合单词,也要替换空格(比如
4 4aefs→4|4aefs)
正确的Sed命令
先修正你原始命令的错误
如果你只是想解决「替换数字+空格+字母中的空格,但不删除数字和字母」的问题,用这个基础命令就够了:
sed 's/\([0-9]\) \([a-zA-Z]\)/\1|\2/g' file.txt
它会捕获数字\([0-9]\)和字母\([a-zA-Z]\),只把中间的空格替换成|,不会丢失任何原有字符。
完全贴合你示例的通用命令
要精准匹配你的期望输出,我们可以分两步处理:
- 替换所有多位数后的空格为
| - 替换单个数字+空格+数字开头的混合单词间的空格为
|
对应的命令:
sed -E 's/([0-9]{2,}) +/\1|/g; s/([0-9]) +([0-9][a-zA-Z]+)/\1|\2/g' file.txt
测试验证
用这个命令处理你的输入:
输入:12315 asdfea 1 1ffesa 45456 asefasef 1 era 12 asfase 4 4aefs
会得到你想要的输出:
12315|asdfea 1 1ffesa 45456|asefasef 1 era 12|asfase 4|4aefs
总结
你的原始命令错误在于直接替换了整段匹配字符,而不是只替换目标空格。通过反向引用和分场景的正则匹配,我们可以精准控制哪些空格需要替换,完全满足你的需求。
内容的提问来源于stack exchange,提问作者ERH
相关产品推荐
相关产品推荐

