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?
s='foo bar baz'
a=( $s )
echo ${a[0]}
echo ${a[1]}
...
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
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.
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
)
$ 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
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".
Le -a
l'option read
vous permettra de diviser une ligne lue par les caractères contenus dans $IFS
.
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
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