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 ( bash
zsh
), 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% )).