Puede sedhacer algo como:
12345
volverse :
1&2&3&4&5
?
Con GNU sed:
sed 's/./\&&/2g'
( ssustituya cada gcará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 awkimplementaciones (no POSIX ya que el comportamiento no está especificado para un FS vacío):
awk -F '' -v OFS="&" '{$1=$1;print}'
(con gawky algunas otras awkimplementaciones, 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=NFtambié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'
( -peEjecuta el código para cada línea, e imprime el resultado ( $_); -ltiras y vuelve a agregar los finales de línea de forma automática; -apuebla @Fcon 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 zshoperadores 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 kshun 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 ksh93operadores 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 bashoperadores 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 extgloben bash)).
012345entradaawk -F '' -v OFS="&" 'NF=NF'Utilidades Unix:
Explicado:
"fold -w1"- envolverá cada carácter de entrada en su propia línea"paste -sd\& -"- fusionará las líneas de entrada juntas, utilizándolas&como separador(Tenga en cuenta que si la entrada contiene varias líneas, se unirán con
&)fuente
echo "abcdeéèfg" | fold -1 | paste -sd\& -sed.sedrespuestas 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 obligatorioIf no file operands are specified, the standard input shall be usedUtilizar
sedfuente
Información: GNU sed manual, extensiones de expresión regular .
Pruebas:
fuente
Esto será un poco más lento que algunas de las otras respuestas, pero está bastante claro:
fuente
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.
Funciona también en caracteres multibyte.
fuente
seddos veces, unsedscript puede tener varios comandos:sed -r 's/(.)/\1\&/g; s/\&$//g'