Pode sed
fazer algo como:
12345
tornar-se :
1&2&3&4&5
?
Com o GNU sed
:
sed 's/./\&&/2g'
( s
substitua cada g
caractere ( .
) 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 awk
implementações (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 awk
implementaçõ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=NF
també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'
( -pe
executa o código para cada linha e imprime o resultado ( $_
); -l
remove e adiciona automaticamente as terminações de linha; -a
preenche @F
com 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 zsh
operadores 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 ksh
um 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 ksh93
operadores 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 bash
operadores 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 extglob
em bash
)).
012345
entradaawk -F '' -v OFS="&" 'NF=NF'
Utilitários Unix:
Explicado:
"fold -w1"
- envolverá cada caractere de entrada em sua própria linha"paste -sd\& -"
- fundirá as linhas de entrada, usando&
como separador(Observe que, se a entrada contiver várias linhas, elas serão unidas
&
)fonte
echo "abcdeéèfg" | fold -1 | paste -sd\& -
sed
.sed
respostas 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árioIf no file operands are specified, the standard input shall be used
Usar
sed
fonte
Informações: GNU sed manual, extensões de expressão regular .
Teste:
fonte
Isso será um pouco mais lento que algumas das outras respostas, mas é bem claro:
fonte
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.
Também funciona em caracteres multibyte.
fonte
sed
duas vezes, umsed
script pode ter vários comandos:sed -r 's/(.)/\1\&/g; s/\&$//g'