Respuestas:
Con GNU sed
:
sed 's/./\&&/2g'
( s
sustituya cada g
carácter ( .
) con ( &
) precedido por &
( \&
) pero solo a partir de la segunda aparición ( 2
)).
Portablemente:
sed 's/./\&&/g;s/&//'
(reemplaza cada aparición, pero luego elimina la primera &
que no queremos).
Con algunas awk
implementaciones (no POSIX ya que el comportamiento no está especificado para un FS vacío):
awk -F '' -v OFS="&" '{$1=$1;print}'
(con gawk
y algunas otras awk
implementaciones, un separador de campo vacío divide los registros en sus componentes de caracteres . El separador de campo de salida ( OFS
) se establece en &
. Asignamos un valor a $1
(sí mismo) para forzar la regeneración del registro con el nuevo separador de campo antes de imprimirlo, NF=NF
también funciona y es un poco más eficiente en muchas implementaciones awk, pero el comportamiento cuando lo hace no está especificado por POSIX).
perl
:
perl -F -lape '$_=join"&",@F'
( -pe
Ejecuta el código para cada línea, e imprime el resultado ( $_
); -l
tiras y vuelve a agregar los finales de línea de forma automática; -a
puebla @F
con fractura de entrada en el set delimitador en -F
., Que aquí es una cadena vacía El resultado es dividir cada carácter en @F
, luego únalas con '&' e imprima la línea).
Alternativamente:
perl -pe 's/(?<=.)./&$&/g'
(reemplace cada carácter siempre que esté precedido por otro carácter (operador regexp retrospectivo (? <= ...))
Usar zsh
operadores de shell:
in=12345
out=${(j:&:)${(s::)in}}
(de nuevo, divida en un separador de campo vacío con el s::
indicador de expansión de parámetros y únase a &
)
O:
out=${in///&} out=${out#?}
(reemplace cada aparición de nada (por lo tanto, antes de cada carácter) con el &
uso del ${var//pattern/replacement}
operador ksh (aunque en ksh
un patrón vacío significa algo más y, sin embargo, algo más, no estoy seguro de qué bash
), y elimine el primero con el ${var#pattern}
pelado POSIX operador).
Usar ksh93
operadores de shell:
in=12345
out=${in//~(P:.(?=.))/\0&}
( ~(P:perl-like-RE)
siendo un operador global de ksh93 para usar expresiones regulares similares a Perl (diferentes de las de Perl o PCRE), (?=.)
siendo el operador de búsqueda anticipada: reemplace un carácter siempre que sea seguido por otro carácter consigo mismo ( \0
) y &
)
O:
out=${in//?/&\0}; out=${out#?}
(reemplaza cada carácter ( ?
) con &
y en sí mismo ( \0
), y eliminamos el superflous)
Usar bash
operadores de shell:
shopt -s extglob
in=12345
out=${in//@()/&}; out=${out#?}
(igual que zsh
's, salvo que se debe @()
allí (un operador de ksh pegote para el que necesita extglob
en bash
)).
awk -F '' -v OFS="&" 'NF=NF'
Utilidades Unix:
fold -w1|paste -sd\& -
Explicado:
"fold -w1"
- envolverá cada carácter de entrada en su propia línea
doblar: ajusta cada línea de entrada para que se ajuste al ancho especificado
-w, --width = WIDTH usa columnas WIDTH en lugar de 80
%echo 12345|fold -w1
1
2
3
4
5
"paste -sd\& -"
- fusionará las líneas de entrada juntas, utilizándolas &
como separador
pegar: fusionar líneas de archivos
-s, --serial pegar un archivo a la vez en lugar de en paralelo
-d, --delimiters = LIST reutiliza caracteres de LIST en lugar de TAB
%fold -w1|paste -sd\& -
1&2&3&4&5
(Tenga en cuenta que si la entrada contiene varias líneas, se unirán con &
)
echo "abcdeéèfg" | fold -1 | paste -sd\& -
sed
.
sed
respuestas disponibles a continuación. Y no veo ningún daño en demostrar cómo se puede resolver la tarea por otros medios.
"-w"
, ¡gracias! "-"
, a su vez, no es obligatorio If no file operands are specified, the standard input shall be used
sed 's/\B/\&/g'
\ B - Coincide en todas partes excepto en un límite de palabra; es decir, coincide si el carácter a la izquierda y el carácter a la derecha son caracteres de "palabra" o caracteres de "no palabra".
Información: GNU sed manual, extensiones de expresión regular .
Pruebas:
sed 's/\B/\&/g' <<< '12345'
1&2&3&4&5
Esto será un poco más lento que algunas de las otras respuestas, pero está bastante claro:
echo 12345 | perl -lnE 'say join "&", split //'
Aquí hay otra forma. La primera parte de la expresión sed captura a cada personaje y luego la reemplaza con el personaje y un signo. La segunda parte elimina el ampersand del final de la línea.
echo 12345 | sed -r 's/(.)/\1\&/g;s/\&$//g'
1&2&3&4&5
Funciona también en caracteres multibyte.
sed
dos veces, un sed
script puede tener varios comandos:sed -r 's/(.)/\1\&/g; s/\&$//g'
012345
entrada