J'ai une chaîne comme: dog cat bird whale
Et je veux avoir dog dog cat cat bird bird whale whale
Tous les mots sont sur la même ligne. Une idée?
Ajout à la famille de solutions :-).
duplicator.sh
:
for i; do echo -n "$i $i "; done; echo
Rendez exécutable, et maintenant:
$ ./duplicator.sh dog cat bird whale
dog dog cat cat bird bird whale whale
Alternativement comme fonction shell, par exemple pour être réutilisable dans un script:
duplicator() {
for i; do echo -n "$i $i "; done; echo
}
qui peut ensuite être exécuté directement là où il est défini comme
duplicator dog cat bird whale
Vous pouvez utiliser
sed
:Si vous souhaitez enregistrer les modifications apportées au fichier sur place, dites:
Vous pouvez également utiliser
perl
:(Ajoutez l'
-i
option pour enregistrer les modifications apportées au fichier sur place.)Ou, comme l'a suggéré terdon :
Citant de
perlvar
:la source
sed -r 's/\S+/& &/g'
.-a
:perl -M5.10.0 -ane 'say join " ", map{$_, $_} @F;'
Que serait-ce sans
awk/gawk
réponse:Si une nouvelle ligne de terminaison est importante:
la source
for(i=1;i<=NF;++i) printf "%s %s ",$i,$i;
est à la fois plus court et plus lisible, à mon humble avis .la source
sed -n 'p;p'
- je pensais que c'était plus transparent sur ce qu'il faisait.Si vous avez votre chaîne dans une variable, disons
foo="dog cat bird whale"
, vous pouvez faire:Bash pur:
Explication: Les parenthèses sont nécessaires pour que le
read
etecho
se produisent dans le même sous-shell et peuvent donc partager des variables. Sans eux, leecho
serait simplement imprimer une ligne vierge.coreutils:
Explication: Le
-o
drapeau dejoin
vous permet de définir le format de sortie. Ici, je lui dis d'imprimer le 1er champ du 1er fichier (1.1
), suivi du 2ème champ du 1er fichier (1.2
) etc. De cette façon, chaque champ du 1er fichier est imprimé deux fois. Cependant,join
est conçu pour, bien, joindre deux lignes d'entrée sur un champ commun. Donc, je lui passe également une ligne vide (<(echo)
), puis je l'ignore. Le-j
définit le champ de jointure, en le définissant sur un champ qui n'existe pas (le 5e) provoque l'join
impression de la ligne entière.Si vous ne vous souciez pas des espaces ou de l'ordre d'entrée, vous pouvez le faire
Perl 1:
Explication:
Le script ci-dessus enregistre chaque champ (de
@F
) deux fois dans le tableau@k
, puis l'imprime@k
. Si vous n'avez pas besoin de la nouvelle ligne de fin, vous pouvez simplifierPerl 2:
Explication: L'
-0
option définit le séparateur d'enregistrement d'entrée (sous forme de nombre hexadécimal ou octal, voir ici pour les conversions). Ici, je le mets à octal040
qui est un espace. Les-p
marquesperl
impriment chaque "ligne" d'entrée et puisque nous avons défini le séparateur d'enregistrement sur espace, les lignes sont maintenant définies par des espaces, donc chaque champ est imprimé deux fois.awk
:Explication:
NF
est le nombre de champs, donc le script ci-dessus passe par chaque champ et l'ajoute à lui-même. Une fois cela fait, nous imprimons la ligne (1;
c'est juste un raccourci pour l'impression).la source
Maintenant pour une
python
réponse:Depuis la ligne de commande:
Depuis stdin:
Le résultat dans les deux cas:
la source
Un peu exagéré, mais une
haskell
réponse:la source
Une autre approche, utilisant également uniquement les builds bash
Je ne vois aucun avantage par rapport à la première réponse, juste pour montrer une manière légèrement différente, qui pourrait être mieux adaptée à certaines fins.
la source
echo
est également un shell intégré à Bash (testtype echo
).