web-dev-qa-db-fra.com

Comment diviser une ligne en mots séparés par un ou plusieurs espaces en bash?

Je me rends compte comment le faire en python, juste avec

line = db_file.readline()
ll=string.split(line)

mais comment puis-je faire de même en bash? est-il vraiment possible de le faire de manière si simple?

41
asdf
s='foo bar baz'
a=( $s )
echo ${a[0]}
echo ${a[1]}
...
124
ZoogieZork

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

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

Imprime le deuxième mot séparé par des espaces dans $ LINE. Vous pouvez également diviser sur d'autres personnages, par exemple.

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

Cela dépend de ce que vous entendez par split. Si vous souhaitez parcourir les mots d'une ligne, qui est dans une variable, vous pouvez simplement itérer. Par exemple, supposons que la variable line soit this is a line. Ensuite, vous pouvez le faire:

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

Cela imprimera:

this
is
a
line

for .. in $var divise $var en utilisant les valeurs de $IFS, dont la valeur par défaut signifie "espaces vides et sauts de ligne".

Si vous souhaitez lire les lignes de l'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 explicite et définir votre question plus en détail.

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

30
Alok Singhal
echo $line | tr " " "\n"

donne des résultats similaires à 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 sais pas grand chose python et en supposant que vous devez assigner la sortie à une variable),

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

devrait suffire (n'oubliez pas de echo "$ll" au lieu de echo $ll)

17
harshvchawla
$ 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
10
Dennis Williamson

fais ça

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

1 $, 2 $, etc. seront vos 1er et 2e "champs" divisés. utilisez $ @ pour obtenir toutes les valeurs ... utilisez $ # pour obtenir la longueur des "champs".

10
ghostdog74

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

5

Plus simple,

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

\ s -> caractère d'espacement (espace, tabulation, NL, FF, VT, CR). Dans de nombreux systèmes, également valide [: space:]

\ n -> nouvelle ligne

5
cturiel

Si vous avez déjà votre ligne de texte dans une variable $ LINE, alors vous devriez pouvoir dire

for L in $LINE; do
   echo $L;
done
3
Phil Miller