可以sed
做类似的东西:
12345
变得 :
1&2&3&4&5
?
答案1
使用 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
自动删除并重新添加行结尾;-a
@F
使用中设置的分隔符上的输入分割进行填充-F
,这里是一个空字符串。结果是将每个字符拆分为@F
,然后用 '&' 将它们连接起来,并打印该行。)
或者:
perl -pe 's/(?<=.)./&$&/g'
(替换前面有另一个字符的每个字符(后视正则表达式运算符 (?<=...))
使用zsh
shell 运算符:
in=12345
out=${(j:&:)${(s::)in}}
(再次,使用参数扩展标志在空字段分隔符上进行拆分s::
,然后使用 进行连接&
)
或者:
out=${in///&} out=${out#?}
&
(使用ksh 运算符替换所有出现的内容(因此在每个字符之前)${var//pattern/replacement}
(尽管在ksh
空模式中意味着其他内容,但还有其他内容,我不确定 中的内容),并使用 POSIX剥离bash
删除第一个${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#?}
(与 's 相同zsh
,但您需要在那里(您需要在)@()
中使用 ksh glob 运算符))。extglob
bash
答案2
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 中的字符而不是制表符
%fold -w1|paste -sd\& -
1&2&3&4&5
(请注意,如果输入包含多行,它们将用 联接&
)
答案3
使用sed
sed 's/./&\&/g;s/.$//'
答案4
这会比其他一些答案慢一点,但很清楚:
echo 12345 | perl -lnE 'say join "&", split //'