Respostas:
Com o GNU sed:
sed 's/./\&&/2g'
( ssubstitua cada gcaractere ( .) pelo mesmo ( &) precedido por &( \&), mas apenas começando na segunda ocorrência ( 2)).
Portably:
sed 's/./\&&/g;s/&//'
(substitua todas as ocorrências, mas remova a primeira &que não queremos).
Com algumas awkimplementações (não POSIX, pois o comportamento não é especificado para um FS vazio):
awk -F '' -v OFS="&" '{$1=$1;print}'
(com gawke algumas outras awkimplementações, um separador de campo vazio divide os registros em seus constituintes de caracteres . O separador de campo de saída ( OFS) está definido como &. Atribuímos um valor a $1(ele mesmo) para forçar o registro a ser regenerado com o novo separador de campo antes de imprimi-lo, NF=NFtambém funciona e é um pouco mais eficiente em muitas implementações do awk, mas o comportamento quando você faz isso não é atualmente especificado pelo POSIX).
perl:
perl -F -lape '$_=join"&",@F'
( -peexecuta o código para cada linha e imprime o resultado ( $_); -lremove e adiciona automaticamente as terminações de linha; -apreenche @Fcom a divisão de entrada no delimitador definido -F, que é uma cadeia vazia. O resultado é dividir cada caractere @F, junte-os com '&' e imprima a linha.)
Alternativamente:
perl -pe 's/(?<=.)./&$&/g'
(substitua cada caractere, desde que seja precedido por outro caractere (veja o operador regexp (? <= ...))
Usando zshoperadores shell:
in=12345
out=${(j:&:)${(s::)in}}
(novamente, divida em um separador de campo vazio usando o s::sinalizador de expansão de parâmetro e junte-se a &)
Ou:
out=${in///&} out=${out#?}
(substitua todas as ocorrências de nada (portanto, antes de cada caractere) pelo &uso do ${var//pattern/replacement}operador ksh (embora em kshum padrão vazio signifique outra coisa, e ainda outra coisa, não sei ao certo em que bash), e remova a primeira com a ${var#pattern}remoção do POSIX operador).
Usando ksh93operadores shell:
in=12345
out=${in//~(P:.(?=.))/\0&}
( ~(P:perl-like-RE)sendo um operador glob do ksh93 para usar expressões regulares do tipo perl (diferente do perl ou do PCRE), (?=.)sendo o operador antecipado: substitua um caractere, desde que seja seguido por outro caractere ( \0) e &)
Ou:
out=${in//?/&\0}; out=${out#?}
(substitua cada caractere ( ?) por &e ele próprio ( \0) e removemos o caractere supérfluo)
Usando bashoperadores shell:
shopt -s extglob
in=12345
out=${in//@()/&}; out=${out#?}
(o mesmo que zsh's, exceto que você precisa @()lá (um operador de ksh glob para a qual você precisa extglobem bash)).
awk -F '' -v OFS="&" 'NF=NF'
Utilitários Unix:
fold -w1|paste -sd\& -
Explicado:
"fold -w1" - envolverá cada caractere de entrada em sua própria linha
dobra - enrole cada linha de entrada para caber na largura especificada
-w, --width = WIDTH usa colunas WIDTH em vez de 80
%echo 12345|fold -w1
1
2
3
4
5
"paste -sd\& -"- fundirá as linhas de entrada, usando &como separador
colar - mesclar linhas de arquivos
-s, --serial, cole um arquivo por vez, em vez de em paralelo
-d, --delimiters = LIST reutiliza caracteres de LIST em vez de TABs
%fold -w1|paste -sd\& -
1&2&3&4&5
(Observe que, se a entrada contiver várias linhas, elas serão unidas &)
echo "abcdeéèfg" | fold -1 | paste -sd\& -
sed.
sedrespostas disponíveis abaixo. E não vejo mal em demonstrar como a tarefa pode ser resolvida por outros meios.
"-w", thx! "-", Por sua vez, não é necessário If no file operands are specified, the standard input shall be used
sed 's/\B/\&/g'
\ B - Corresponde a todos os lugares, exceto no limite de uma palavra; ou seja, corresponde se o caractere à esquerda e o caractere à direita são caracteres de "palavra" ou caracteres de "não palavra".
Informações: GNU sed manual, extensões de expressão regular .
Teste:
sed 's/\B/\&/g' <<< '12345'
1&2&3&4&5
Isso será um pouco mais lento que algumas das outras respostas, mas é bem claro:
echo 12345 | perl -lnE 'say join "&", split //'
Aqui está outra maneira. A primeira parte da expressão sed captura todos os caracteres e os substitui pelo personagem e um e comercial. A segunda parte remove o e comercial do final da linha.
echo 12345 | sed -r 's/(.)/\1\&/g;s/\&$//g'
1&2&3&4&5
Também funciona em caracteres multibyte.
sedduas vezes, um sedscript pode ter vários comandos:sed -r 's/(.)/\1\&/g; s/\&$//g'
012345entrada