Tengo una cadena como: dog cat bird whale
Y quiero conseguir dog dog cat cat bird bird whale whale
Todas las palabras están en la misma línea. ¿Alguna idea?
Agregando a la familia de soluciones :-).
duplicator.sh:
for i; do echo -n "$i $i "; done; echo
Hacer ejecutable, y ahora:
$ ./duplicator.sh dog cat bird whale
dog dog cat cat bird bird whale whale
Alternativamente como una función de shell, por ejemplo, para ser reutilizable dentro de un script
duplicator() {
for i; do echo -n "$i $i "; done; echo
}
que luego se puede ejecutar directamente donde se define como
duplicator dog cat bird whale
Podrías usar
sed:Si desea guardar los cambios en el archivo en el lugar, diga:
También puedes usar
perl:(Agregue la
-iopción para guardar los cambios en el archivo en el lugar).O, como lo sugiere terdon :
Citando de
perlvar:fuente
sed -r 's/\S+/& &/g'.-a:perl -M5.10.0 -ane 'say join " ", map{$_, $_} @F;'¿Qué sería esto sin una
awk/gawkrespuesta?Si una nueva línea de terminación es importante:
fuente
for(i=1;i<=NF;++i) printf "%s %s ",$i,$i;es más corto y más legible, en mi humilde opinión.fuente
sed -n 'p;p', pensé que era más transparente sobre lo que estaba haciendo.Si tiene su cadena en una variable, por ejemplo
foo="dog cat bird whale", podría hacer:Golpe puro:
Explicación: Los paréntesis son necesarios para que
readyechosuceda en la misma subshell y, por lo tanto, puedan compartir variables. Sin ellos,echosimplemente imprimirían una línea en blanco.coreutils:
Explicación: El
-oindicador de lejoinpermite establecer el formato de salida. Aquí, le digo que imprima el primer campo del primer archivo (1.1), seguido del segundo campo del primer archivo (1.2), etc. De esta manera, cada campo del primer archivo se imprime dos veces. Sin embargo,joinestá diseñado para, bueno, unir dos líneas de entrada en un campo común. Entonces, también le paso una línea en blanco (<(echo)) y luego lo ignoro. Los-jconjuntos se unen las de campo, estableciendo que a uno que no existe (la quinta) hace quejoinimprimir toda la línea.Si no le importa el espacio en blanco o el orden de entrada, puede hacer
Perl 1:
Explicación:
La secuencia de comandos anterior guardará cada campo (de
@F) dos veces en la matriz@ky luego imprimirá@k. Si no necesita la nueva línea final, puede simplificarPerl 2:
Explicación: La
-0opción establece el separador de registro de entrada (como un número hexadecimal u octal, consulte aquí las conversiones). Aquí, lo estoy configurando en octal,040que es un espacio. Las-pmarcasperlimprimen cada "línea" de entrada y dado que hemos establecido el separador de registros en espacio, las líneas ahora están definidas por espacios, por lo que cada campo se imprime dos veces.awk:Explicación:
NFes el número de campos, por lo que el script anterior recorre cada campo y lo agrega a sí mismo. Una vez hecho esto, imprimimos la línea (1;es solo una abreviatura para imprimir).fuente
Ahora por un
pythonrespuesta:Desde la línea de comando:
De stdin:
El resultado en ambos casos:
fuente
Ligeramente exagerado, pero una
haskellrespuesta:fuente
Otro enfoque, que también usa solo bash builtins
No veo ningún beneficio en comparación con la respuesta principal, solo para mostrar una forma ligeramente diferente, que podría ser más adecuada para algunos propósitos.
fuente
echoTambién es un shell incorporado en Bash (pruebatype echo).