Com o GNU sed :
sed 's/./\&&/2g'
( s ubstitute a cada ( g ) caractere ( . ) com o mesmo ( & ) precedido por & ( \& ) mas apenas a partir da segunda ocorrência ( 2 )).
Portável:
sed 's/./\&&/g;s/&//'
(substitua todas as ocorrências, mas remova o primeiro & que não queremos).
Com algumas implementações awk (não POSIX, pois o comportamento não é especificado para um FS vazio):
awk -F '' -v OFS="&" '{$1=$1;print}'
(com gawk e algumas outras implementações awk , um separador de campo vazio divide os registros em seus constituintes de caracteres . separador de campo de saída ( OFS ) é definido como & . Atribuímos um valor a $1 (próprio) para forçar o registro a ser gerado novamente com o novo separador de campo antes de imprimi-lo, NF=NF também funciona e é um pouco mais eficiente em muitas implementações do awk, mas o comportamento quando você faz isso não é especificado pelo POSIX).
perl :
perl -F -lape '$_=join"&",@F'
( -pe executa o código para cada linha e imprime o resultado ( $_ ); -l retira e adiciona novamente os finais de linha automaticamente; -a preenche @F com entrada dividida no conjunto delimitador em -F , que aqui é uma string vazia. O resultado é dividir todos os caracteres em @F , depois juntá-los com '&', e imprima a linha.)
Alternativamente:
perl -pe 's/(?<=.)./&$&/g'
(substitua todos os caracteres desde que sejam precedidos por outro caractere (operador regexp de look-behind (? < = ...))
Usando zsh operadores de shell:
in=12345
out=${(j:&:)${(s::)in}}
(novamente, divida em um separador de campo vazio usando o sinalizador de expansão do parâmetro s:: e junte-se a & )
Ou:
out=${in///&} out=${out#?}
(substitua todas as ocorrências de nada (assim antes de cada caractere) com & usando o operador ${var//pattern/replacement} ksh (embora em ksh um padrão vazio signifique outra coisa, e ainda outra coisa, não tenho certeza do que em bash ) e remova o primeiro com o operador de remoção POSIX ${var#pattern} ).
Usando ksh93 operadores de shell:
in=12345
out=${in//~(P:.(?=.))/out=${in//?/&shopt -s extglob
in=12345
out=${in//@()/&}; out=${out#?}
}; out=${out#?}
&}
( ~(P:perl-like-RE) sendo um operador ksh93 glob para usar expressões regulares semelhantes a perl (diferente de perl ou PCRE), (?=.) sendo o operador look-ahead: substitua um caractere desde que seja seguido por outro caractere consigo mesmo ( ) e &? )
Ou:
sed 's/./\&&/2g'
(substitua todos os caracteres ( & ) por e por si ( bashzsh ), e removemos o superfluço)
Usando @() operadores de shell:
sed 's/./\&&/g;s/&//'
(o mesmo que extglob , exceto que você precisa de bash lá (um operador de ksh glob para o qual você precisa de %code% em %code% )).