Puede sed
hacer algo como:
12345
volverse :
1&2&3&4&5
?
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
)).
012345
entradaawk -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
.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 obligatorioIf no file operands are specified, the standard input shall be used
Utilizar
sed
fuente
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
sed
dos veces, unsed
script puede tener varios comandos:sed -r 's/(.)/\1\&/g; s/\&$//g'