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

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

可以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' 

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

使用zshshell 运算符:

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

(再次,使用参数扩展标志在空字段分隔符上进行拆分s::,然后使用 进行连接&

或者:

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

&(使用ksh 运算符替换所有出现的内容(因此在每个字符之前)${var//pattern/replacement}(尽管在ksh空模式中意味着其他内容,但还有其他内容,我不确定 中的内容),并使用 POSIX剥离bash删除第一个${var#pattern}操作员)。

使用ksh93shell 运算符:

in=12345
out=${in//~(P:.(?=.))/\0&}

~(P:perl-like-RE)作为 ksh93 glob 运算符来使用类似 perl 的正则表达式(但与 perl 或 PCRE 不同),(?=.)作为前瞻运算符:替换一个字符,前提是它后面跟着另一个字符本身 ( \0) 和&)

或者:

out=${in//?/&\0}; out=${out#?}

(将每个字符 ( ?) 替换为&及其本身 ( \0),然后删除多余的字符)

使用bashshell 运算符:

shopt -s extglob
in=12345
out=${in//@()/&}; out=${out#?}

(与 's 相同zsh,但您需要在那里(您需要在)@()中使用 ksh glob 运算符))。extglobbash

答案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 //'

相关内容