2009-12-29 7 views

Répondre

4

L'option -a de read vous permettra de diviser une ligne lue par les caractères contenus dans $IFS.

+0

#/bin/bash filename = 1 $ en ligne de lecture faire \t echo $ EN LIGNE! | read -a done <$ filename cela devrait-il fonctionner? – asdf

+0

Non, -a serait un argument à la première lecture. "help read" à une ligne de commande bash va, euh ... aider. –

+2

@asdf: Cela ressemblerait à ceci: 'filename = $ 1; pendant la lecture -a LIGNE; fais écho "$ LINE"; done <"$ filename" ' –

9
$ line="these are words" 
$ ll=($line) 
$ declare -p ll # dump the array 
declare -a ll='([0]="these" [1]="are" [2]="words")' 
$ for w in ${ll[@]}; do echo $w; done 
these 
are 
words 
+1

+1 pour m'avoir enseigné l'option -p – grok12

110
s='foo bar baz' 
a=($s) 
echo ${a[0]} 
echo ${a[1]} 
... 
+1

ce que je cherchais, merci – asdf

+14

Ceci devrait être marqué comme la bonne réponse – jaywink

+0

Variante en ligne: BAR =" $ (a = ($ value); echo $ {a [1]}) » –

28

Cela dépend de ce que vous entendez par divisé. Si vous voulez parcourir des mots sur une ligne, qui se trouve dans une variable, vous pouvez simplement itérer. Par exemple, disons que la variable line est this is a line. Ensuite, vous pouvez le faire:

for word in $line; do echo $word; done 

Ce imprimera:

this 
is 
a 
line 

for .. in $var divise $var en utilisant les valeurs $IFS, la valeur par défaut qui signifie « blancs cassés et des sauts de ligne ».

Si vous voulez lire les lignes d'un utilisateur ou d'un fichier, vous pouvez faire quelque chose comme:

cat $filename | while read line 
do 
    echo "Processing new line" >/dev/tty 
    for word in $line 
    do 
     echo $word 
    done 
done 

Pour toute autre chose, vous devez être plus explicites et définir votre question plus en détail.

Note: Edité pour supprimer le bashisme, mais j'ai quand même gardé cat $filename | ... parce que je l'aime plus que la redirection.

+5

Utilisation inutile de 'cat' - redirige le fichier comme ceci:' done <"$ filename" '. En outre, utilisez 'for value in" $ {var [@]} "' dans ce contexte au lieu d'une variable d'index. Alors que dans ce cas le tableau peut être contigu, Bash supporte les tableaux clairsemés et '$ {# var [@]}' peut ne pas être la dernière entrée (bien que '$ {var [@]: -1}' soit et = ($ {! a [@]}); count = $ {# indices [@]} 'donnera la liste des indices et le nombre correct) –

+1

@Dennis: Tous les bons points. Je suis habitué à 'cat un | blah' au lieu de 'blah

2

Si vous avez déjà votre ligne de texte dans une variable $ ligne, alors vous devriez être en mesure de dire

for L in $LINE; do 
    echo $L; 
done 
9

faire

while read -r line 
do 
    set -- $line 
    echo "$1 $2" 
done <"file" 

1 $, 2 $ etc sera votre 1er et 2ème "champs" divisés. utilisez $ @ pour obtenir toutes les valeurs .. use $ # pour obtenir la longueur des "champs".

+1

Notez que si votre ligne $ contient par exemple. '*', ceci sera agrandi par bash en faisant 'set - $ line', ce qui peut avoir des effets surprenants. – clacke

+0

1) Que fait le "-"? 2) Quels effets surprenants l'expansion * peut-elle avoir? – Xofo

27

Si vous voulez un mot spécifique de la ligne, awk peut être utile, par ex.

 
$ echo $LINE | awk '{print $2}' 

Imprime le deuxième mot séparé par des espaces dans $ LINE. Vous pouvez également partager d'autres caractères, par ex.

 
$ echo "5:6:7" | awk -F: '{print $2}' 
6 
+1

C'est ma raison de commencer à utiliser awk tout à l'heure. Contrairement à la création de tableaux et aux lignes supplémentaires. -F: ne fait qu'exploser: en une seule ligne. J'adore, merci. – erm3nda

+0

en outre: 'echo" 5 :: 6: 7 "| awk -F :: '{print $ 2}' ' ' 6: 7' (différemment de couper, cela prend seulement un char comme délimiteur) – ribamar

5

Plus simple,

echo $line | sed 's/\s/\n/g' 

\s --> whitespace character (space, tab, NL, FF, VT, CR). In many systems also valid [:space:]

\n --> new line

15
echo $line | tr " " "\n" 

donne une sortie similaire à ceux de la plupart des réponses ci-dessus; sans utiliser de boucles.


Dans votre cas, vous mentionnez également ll=<...output...>,
donc, (étant donné que je ne connais pas beaucoup python et en supposant que vous devez affecter la sortie à une variable),

ll=`echo $line | tr " " "\n"` 

devrait suffire (souvenez-vous de echo "$ll" au lieu de echo $ll)

Questions connexes