Eu tenho uma string como: dog cat bird whale
E eu quero pegar dog dog cat cat bird bird whale whale
Todas as palavras estão na mesma linha. Qualquer ideia?
Adicionando à família de soluções :-).
duplicator.sh
:
for i; do echo -n "$i $i "; done; echo
Torne executável e agora:
$ ./duplicator.sh dog cat bird whale
dog dog cat cat bird bird whale whale
Alternativamente, como uma função shell, por exemplo, para ser reutilizável dentro de um script:
duplicator() {
for i; do echo -n "$i $i "; done; echo
}
que pode ser executado diretamente onde definido como
duplicator dog cat bird whale
Você poderia usar
sed
:Se você deseja salvar as alterações no arquivo no local, diga:
Você também pode usar
perl
:(Adicione a
-i
opção para salvar as alterações no arquivo no local.)Ou, como sugerido por terdon :
Citação de
perlvar
:fonte
sed -r 's/\S+/& &/g'
.-a
:perl -M5.10.0 -ane 'say join " ", map{$_, $_} @F;'
O que seria isso sem uma
awk/gawk
resposta:Se uma nova linha final for importante:
fonte
for(i=1;i<=NF;++i) printf "%s %s ",$i,$i;
é mais curto e mais legível, IMHO.fonte
sed -n 'p;p'
- achei mais transparente o que estava fazendo.Se você tem sua string em uma variável, digamos
foo="dog cat bird whale"
, você pode fazer:Festa pura:
Explicação: Os parênteses são necessários para que o
read
eecho
aconteça no mesmo subshell e, portanto, possam compartilhar variáveis. Sem eles,echo
apenas imprimiria uma linha em branco.coreutils:
Explicação: O
-o
sinalizador dejoin
permite definir o formato de saída. Aqui, estou dizendo para imprimir o 1º campo do 1º arquivo (1.1
), seguido pelo 2º campo do 1º arquivo (1.2
) etc. Dessa forma, cada campo do 1º arquivo é impresso duas vezes. No entanto,join
foi projetado para, bem, unir duas linhas de entrada em um campo comum. Então, eu também passo uma linha em branco (<(echo)
) e depois a ignoro. Os-j
conjuntos do campo de associação, definindo-o como um que não existe (5º) faz com quejoin
para imprimir toda a linha.Se você não se importa com espaço em branco ou a ordem de entrada, pode fazer
Perl 1:
Explicação:
O script acima salvará cada campo (de
@F
) duas vezes na matriz@k
e depois será impresso@k
. Se você não precisar da nova linha à direita, poderá simplificar paraPerl 2:
Explicação: A
-0
opção define o separador de registros de entrada (como um número hexadecimal ou octal, consulte aqui para conversões). Aqui, estou configurando para octal,040
que é um espaço. As-p
marcasperl
imprimem cada "linha" de entrada e, como definimos o separador de registros como espaço, as linhas agora são definidas por espaços, para que cada campo seja impresso duas vezes.awk
:Explicação:
NF
é o número de campos; portanto, o script acima passa por cada campo e o anexa a si próprio. Feito isso, imprimimos a linha (1;
é apenas uma abreviação para impressão).fonte
Agora, para uma
python
resposta:Na linha de comando:
Partida stdin:
O resultado nos dois casos:
fonte
Um pouco exagerado, mas uma
haskell
resposta:fonte
Outra abordagem, também usando apenas bash builtins
Não vejo nenhum benefício comparado à resposta principal, apenas para mostrar uma maneira um pouco diferente, que pode ser mais adequada para alguns propósitos.
fonte
echo
também é um shell embutido no Bash (testetype echo
).