Linux中如何在行的第一个字节后插入字符

Linux中如何在行的第一个字节后插入字符,linux,bash,text,sed,Linux,Bash,Text,Sed,我有一个设置文件状态1,2,3,意思是在第一、第二和第三个字节之后放置一个, 例如,我的输入是 stackoverflow 那我想去 s,t,a,ckoverflow 我应该如何使用Linux工具来实现它?我觉得应该使用sed,但我不知道怎么做 编辑: 我有10多个逗号要放。该行还包括多字节字符。在sed中: echo stackoverflow | sed 's/./&,/1;s/./&,/3;s/./&,/5' s/../../n替换第n个匹配项。在第一次替换之

我有一个设置文件状态
1,2,3
,意思是在第一、第二和第三个字节之后放置一个

例如,我的输入是

stackoverflow
那我想去

s,t,a,ckoverflow
我应该如何使用Linux工具来实现它?我觉得应该使用
sed
,但我不知道怎么做

编辑:

我有10多个逗号要放。该行还包括多字节字符。

sed
中:

echo stackoverflow | sed 's/./&,/1;s/./&,/3;s/./&,/5'
s/../../n
替换第n个匹配项。在第一次替换之后,第二个字节现在将是第三个匹配,之后,第三个字节现在将是第五个

或者,对于正则表达式组:

echo stackoverflow | sed 's/\(.\)\(.\)\(.\)/\1,\2,\3,/'
在基本正则表达式(BRE)中,
\(…\)
用于对表达式进行分组。例如,您可以使用
\n
引用与第n组匹配的文本,以便在替换中重复使用匹配的文本。因此,在本例中,我有三个组,每个组只包含

使用GNU sed,您可以通过使用扩展正则表达式(ERE)避免
\

对于多字节字符集,请尝试使用C语言环境:

$ echo 'æ  ' | LC_ALL=C sed 's/\(.\)\(.\)\(.\)/\1,\2,\3,/'
�,�, , 
$ echo → | LC_ALL=C sed 's/\(.\)\(.\)\(.\)/\1,\2,\3,/'
�,�,�,

这里有一个不使用sed的替代方案,它可以处理多字节字符和超过10个逗号

S="♥stackoverflow"
I="1,2,11"
i=0
for j in `echo $I | tr ',' '\n'`; do
   printf ${S:i:j-i}
   i=$j
done
printf ${S:i}
此脚本具有以下输出:

♥,s,tackoverf,low
使用
I=“1,2,3,4,5,6,7,8,9,10,11”
时,输出为:

♥,s,t,a,c,k,o,v,e,r,f,low
这可能适用于您(GNU-sed):

或:


@hek2mgl
LC_ALL=C sed…
,也许?这会如何改变输入字符集?@hek2mgl它不会,但它确实会使
sed
将传入字符视为字节宽:
echo→ | LC\u ALL=C sed's/\(.\)\(.\)\(.\)/\1、\2、\3、/'
噢,我从来都不知道
sed
会根据
LC
变量改变这种行为。你能解释一下
s/\(.\)\(.\)/\1、\2、\3、/
的意思吗?我根据你关于多字节字符的新信息更新了我的答案。
S="♥stackoverflow"
I="1,2,11"
i=0
for j in `echo $I | tr ',' '\n'`; do
   printf ${S:i:j-i}
   i=$j
done
printf ${S:i}
♥,s,tackoverf,low
♥,s,t,a,c,k,o,v,e,r,f,low
sed 's/\B/\n/g;s/\n//4g;s/\n/,/g' file
sed 's/\B/,/;s/\B/,/;s/\B/,/' file