sed在每个字符间插入分隔符的本质是将每个单字符替换为“自身+分隔符”,再删除末尾多余分隔符;基础写法为sed 's/./&x/g; s/x$//',gnu sed可简化为sed -e 's/./&x/g; s/x$//',特殊字符需转义,多行文本默认逐行处理。

用 sed 在每个字符之间插入分隔符,本质是把每个单字符(包括字母、数字、符号、空格等)替换成“该字符 + 分隔符”,再额外处理末尾多余的分隔符。
基础方法:用捕获组逐个替换
最通用的方式是匹配任意单个字符(非换行),用括号捕获,然后在替换中加上分隔符:
-
sed 's/./&X/g'——&表示原匹配内容,X是你要插入的分隔符(如,或|),g确保全局替换 - 但这样会在末尾多出一个分隔符,比如
abc变成aXbXcX - 补一步去掉结尾分隔符:
sed 's/./&X/g; s/X$//'
更简洁的一次性写法(GNU sed)
GNU sed 支持扩展正则,可用 sed -r(或 sed -E)配合环视逻辑模拟,但真正简洁的做法仍是两步组合:
-
echo "hello" | sed -E 's/./&;/g; s/;$//'→ 输出h;e;l;l;o - 若分隔符是特殊字符(如
/、&、\),注意转义,例如插斜杠:sed 's/./&\//g; s/\/$//'
处理含换行或多行文本
sed 默认按行处理,每行独立操作。如果原文本有多行,上述命令仍有效,但不会跨行插入分隔符:
-
printf "ab\ncd" | sed 's/./&-/g; s/-$//'→ 输出a-b和c-d两行 - 如需把整个输入当做一个字符串(忽略换行),先用
tr '\n' '\0'转为 NULL 分隔,再处理,最后还原——但这已超出 sed 单命令能力,建议结合awk或 shell 替换
替代方案:用 awk 更直观
虽然问题问的是 sed,但实际中 awk 处理字符级拆分更自然:
echo "abc" | awk '{gsub(/./,"&|"); sub(/\|$/,"")} 1'- 或更清晰:
echo "abc" | awk '{n=split($0,a,""); for(i=1;i











