在`sed`中如何在字符串中的字符之间放置一个“&”?

Modified on: Sat, 30 Jun 2018 05:22:30 +0800

可以sed做类似的事情:

12345

成为:

1&2&3&4&5

作者:GAD3R,user243633

最佳答案

使用GNU sed

sed 's/./\&&/2g'

s ubstitute具有相同(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 。 html#* - F *“rel =”noreferrer“> @F,这里是一个空字符串。结果是将每个字符分成-F,然后将它们与'&'连接起来,然后打印该行。)

可替换地:

perl -pe 's/(?<=.)./&$&/g' 

(替换每个字符,前面有另一个字符(后面的正则表达式运算符(?&lt; = ...))

使用perl -pe 's/(?&lt;=.)./&amp;$&amp;/g' shell运算符:

zsh

(再次,使用in=12345 out=${(j:&amp;:)${(s::)in}} 参数扩展标志拆分空字段分隔符,并使用s::连接)

或者:

in=12345
out=${(j:&:)${(s::)in}}

(使用out=${in///&amp;} out=${out#?} ksh运算符替换&amp;中每次出现的任何事件(所以在每个字符之前)(尽管在${var//pattern/replacement}一个空模式意味着别的东西,还有别的东西,我不确定ksh中的内容,并用POSIX bash剥离运算符)。

使用${var#pattern} shell运算符:

ksh93

in=12345 out=${in//~(P:.(?=.))/\0&amp;} 是一个ksh93 glob运算符,使用类似perl的正则表达式(不同于perl或PCRE),~(P:perl-like-RE)是前瞻操作符:替换一个字符,前提是后跟另一个字符((?=.))和\0

或者:

&amp;

(用out=${in//?/&amp;\0}; out=${out#?} 和它自己(?)替换每个字符(&amp;),然后我们删除超级字符)

使用\0 shell运算符:

out=${in///&} out=${out#?}

(与shopt -s extglob in=12345 out=${in//@()/&amp;}; out=${out#?} 相同,除了你需要zsh(你需要@()的ksh glob运算符) extglob))。


相关问答

添加新评论