2017-05-10 12 views
2

Disons que j'ai deux variables foo et bar contenant le même nombre de newline séparés des chaînes, par exemplefusion de chaînes séparées par saut de ligne

$ echo $foo 
a 
b 
c 
$ echo $bar 
x 
y 
z 

Quelle est la façon la plus simple de fusionner foo et barre pour obtenir la sortie ci-dessous?

a x 
b y 
c z 

Si foo et bar étaient des fichiers que je pouvais faire paste -d ' ' foo bar mais dans ce cas ils sont des chaînes.

Répondre

0

Vous pouvez utiliser la substitution de processus Bash pour ce faire (non conformes à Posix):

foo=$'a\nb\nc' 
bar=$'x\ny\nz' 
paste -d ' ' <(printf '%s\n' "$foo") <(printf '%s\n' "$bar") 

Sorties:

a x 
b y 
c z 

Une façon sh conforme semble un peu alambiquée:

foo=$'a\nb\nc' 
bar=$'x\ny\nz' 
res=$(while IFS=$'\n' read -u 3 -r f1 && IFS=$'\n' read -u 4 -r f2; do 
    printf '%s' "$f1" 
    printf ' %s\n' "$f2" 
done 3<<<"$foo" 4<<<"$bar" 
) 
+1

Vous pouvez supprimer le mot de conformité 'POSIX' pour le dernier extrait, car ni l'ANSI n'a cité les chaînes' $ '..' 'ni l'ici les anneaux sont conformes à la norme shell 'POSIX sh' – Inian

+0

La substitution de processus est également compatible avec bourne-again et la fonction _not_ 'POSIX' bourne' sh' shell compatible. La question était destinée à la dernière coquille. – Inian

+0

Merci @Inian - mis à jour la réponse. La deuxième solution a fonctionné avec 'sh'. – codeforester