2008-12-08 4 views
3

J'essaie d'apprendre la manipulation des chaînes de bash. Comment créer un script bash équivalent à cet extrait de code Java?Gestion des chaînes de caractères Bash (char à l'index et concaténation)

String symbols = "abcdefg12345_"; 
for (char i : symbols.toCharArray()) { 
    for (char j : symbols.toCharArray()) { 
     System.out.println(new StringBuffer().append(i).append(j)); 
    } 
} 

La sortie de l'extrait de code ci-dessus commence par:

aa 
ab 
ac 
ad 
ae 
af 

et se termine par:

_g 
_1 
_2 
_3 
_4 
_5 
__ 

Mon but est d'avoir une liste de caractères autorisés (pas nécessairement les ci-dessus) et imprimer toutes les permutations de longueur 2. Si cela est possible je voudrais une solution qui repose uniquement sur bash et ne nécessite aucune autre installation.

Editer: Juste une petite question de suivi: Y at-il un moyen de le faire avec une chaîne sans espaces séparant les sous-chaînes? Comme LIST = "abcdef12345_"?

Répondre

5

C'est très simple, Bash le fait dans l'analyseur d'entrée. Aucun code requis. Essayez:

echo {a,b,c,d,e,f,g,1,2,3,4,5,_}{a,b,c,d,e,f,g,1,2,3,4,5,_} 

Vous pourriez avoir besoin d'un second passage pour le diviser en lignes, cependant.

Ou, vous pouvez bien sûr utiliser deux boucles imbriquées comme dans votre exemple:

LIST="a b c d e f 1 2 3 4 5 _"; 
for a in $LIST ; do 
    for b in $LIST ; do 
     echo $a$b; 
    done; 
done 
+0

redirigeant la sortie d'écho 'sed -e 's | \ | \ n | g'' travaux sur le premier exemple de diviser la sortie en lignes. –

+0

@Ken G: Belle addition! @unwind: Bien que j'aie aimé le premier exemple, je l'ai sélectionné comme réponse acceptée pour le second, car il me permet de conserver la liste en un seul endroit et la ligne se casse correctement sans avoir à utiliser Sed (disponible en la plupart des endroits, mais pas partout). –

+0

Juste une petite question de suivi: Y at-il un moyen de le faire avec une chaîne sans espaces séparant les sous-chaînes? Comme LIST = "abcdef12345_"? –

0
for i in a b c d e f g 1 2 3 4 5 _; do 
    for j in a b c d e f g 1 2 3 4 5 _; do 
     echo $i$j 
    done 
done 

man bash est votre ami. Il a de grandes sections sur son remplacement variable et les commandes internes.

+0

Alors que l'homme bash est mon ami, je trouve qu'il est un peu long de parcourir (~ 4900 lignes) si vous ne savez pas ce que vous cherchez. Dans ces cas, j'ai souvent Google pour un tutoriel et si cela ne m'aide pas, j'essaie de demander ici. –

+0

Oui, la page de manuel est énorme. Mais je recommande de sauter au moins les titres de section une fois pour que vous sachiez au moins ce qu'il y a dedans. Vous pouvez toujours revenir en arrière et lire plus si vous en avez besoin. – Bombe

0

S'adapte une ligne bien:

for i in `echo {a,b,c,d,e,f,g,1,2,3,4,5,_}{a,b,c,d,e,f,g,1,2,3,4,5,_}`; do echo $i; done 
0

Juste une certaine variation de la façon dont vous pouvez diviser les éléments générés. Personnellement, j'aime utiliser tr pour ce travail. :

echo {a,b,c,d,e,f,g,1,2,3,4,5,_}{a,b,c,d,e,f,g,1,2,3,4,5,_} | tr " " "\n" 
Questions connexes