Answers:
使用GNU sed
:
sed 's/./\&&/2g'
(s
在每个(g
)字符(.
)&
前面加上&
(\&
),但只从第二个出现(2
)开始。
便携性:
sed 's/./\&&/g;s/&//'
(替换所有事件,然后删除&
我们不希望出现的第一个事件)。
对于某些awk
实现(不是POSIX,因为未指定空FS的行为):
awk -F '' -v OFS="&" '{$1=$1;print}'
(在gawk
其他一些awk
实现中,空字段分隔符会将记录拆分成其字符组成部分。输出字段分隔符(OFS
)设置为&
。我们为$1
(自身)分配一个值,以强制使用新的字段分隔符重新生成记录在进行打印之前,它NF=NF
也可以工作,并且在许多awk实现中效率更高,但是您执行此操作时的行为目前尚未由POSIX指定。
perl
:
perl -F -lape '$_=join"&",@F'
(-pe
为每一行运行代码,并打印结果($_
);自动-l
删除并重新添加行尾;在中设置的定界符(这里是一个空字符串)上输入split进行-a
填充。结果是将每个字符均分为,然后将它们与“&”连接起来,然后打印该行。)@F
-F
@F
或者:
perl -pe 's/(?<=.)./&$&/g'
(替换每个字符,前提是每个字符前面都有另一个字符(后置正则表达式运算符(?<= ...))
使用zsh
shell运算符:
in=12345
out=${(j:&:)${(s::)in}}
(再次,使用s::
参数扩展标志在空字段分隔符上进行拆分,然后与结合&
)
要么:
out=${in///&} out=${out#?}
(&
使用${var//pattern/replacement}
ksh运算符替换每次出现的内容(因此在每个字符之前)(尽管在ksh
空模式中表示其他内容,但是我不确定bash
),然后使用POSIX ${var#pattern}
剥离删除第一个运算符)。
使用ksh93
shell运算符:
in=12345
out=${in//~(P:.(?=.))/\0&}
(~(P:perl-like-RE)
是一个ksh93 glob运算符,以使用类似perl的正则表达式(尽管与perl或PCRE的表达式不同),(?=.)
是一个超前运算符:替换一个字符,前提是该字符后跟另一个自身(\0
)和&
)
要么:
out=${in//?/&\0}; out=${out#?}
(将每个字符(?
)替换为&
和自身(\0
),然后删除多余的字符)
使用bash
shell运算符:
shopt -s extglob
in=12345
out=${in//@()/&}; out=${out#?}
(与相同zsh
,除了您需要@()
在那里(需要extglob
在其中输入ksh glob运算符bash
))。
awk -F '' -v OFS="&" 'NF=NF'
Unix实用程序:
fold -w1|paste -sd\& -
解释:
"fold -w1"
-将每个输入字符包装到自己的行中
折叠-包裹每条输入线以适合指定的宽度
-w,--width = WIDTH使用WIDTH列而不是80
%echo 12345|fold -w1
1
2
3
4
5
"paste -sd\& -"
-将输入行合并在一起,&
用作分隔符
粘贴-合并文件行
-s,--serial一次粘贴一个文件,而不是并行
-d,--delimiters = LIST重用LIST中的字符而不是TAB
%fold -w1|paste -sd\& -
1&2&3&4&5
(请注意,如果输入包含多行,它们将与连接在一起&
)
echo "abcdeéèfg" | fold -1 | paste -sd\& -
sed
。
sed
下面有很多不错的答案。在演示如何用其他方法解决任务方面,我认为没有什么害处。
sed 's/\B/\&/g'
\ B-在单词边界处随处匹配;也就是说,如果左侧字符和右侧字符都是“单词”字符或都是“非单词”字符,则匹配。
信息: GNU sed手册,正则表达式扩展。
测试:
sed 's/\B/\&/g' <<< '12345'
1&2&3&4&5
012345
投入