/ / Comment puis-je lire des mots (au lieu de lignes) d'un fichier? - bash

Comment lire des mots (au lieu de lignes) à partir d'un fichier? - bash

J'ai lu cette question sur comment lire n caractères d’un fichier texte en utilisant bash. J'aimerais savoir comment lire un mot à la fois à partir d'un fichier qui ressemble à:

example text
example1 text1
example2 text2
example3 text3

Quelqu'un peut-il m'expliquer cela ou me montrer un exemple simple? Merci!

Réponses:

9 pour la réponse № 1

le read commande par défaut lit des lignes entières. La solution consiste donc probablement à lire toute la ligne, puis à la diviser sur un espace, par exemple for:

while read line; do
for word in $line; do
echo "word = "$word""
done
done

15 pour la réponse № 2

Pour ce faire avec l’entrée standard, il suffit de passer la -a drapeau à lire:

read -a words
echo "${words[@]}"

Ceci lira toute votre ligne dans une variable de tableau indexé, dans ce cas nommée mots. Vous pouvez ensuite effectuer toutes les opérations de tableau de votre choix sur mots avec Expansions des paramètres du shell.

Pour les opérations orientées fichier, les versions actuelles de Bash prennent également en charge le mapfile intégré. Par exemple:

mapfile < /etc/passwd
echo ${MAPFILE[0]}

De toute façon, les tableaux sont la voie à suivre. Il vaut la peine de votre temps pour se familiariser avec Syntaxe du tableau de Bash pour tirer le meilleur parti de cette fonctionnalité.


6 pour la réponse № 3

Normalement, vous devriez lire un fichier en utilisant un while read -r line boucle. Pour ce faire et analyser les mots sur les lignes, vous devez imbriquer un for boucle à l'intérieur du while boucle.

Voici une technique qui fonctionne sans nécessiter de boucles imbriquées:

for word in $(<inputfile)
do
echo "$word"
done

3 pour la réponse № 4

Dans le contexte donné, où le nombre de mots est connu:

while read -r word1 word2 _; do
echo "Read a line with word1 of $word1 and word2 of $word2"
done

Si vous voulez lire chaque ligne dans un tableau, read -a mettra le premier mot dans l'élément 0 de votre tableau, le second dans l'élément 1, etc.:

while read -r -a words; do
echo "First word is ${words[0]}; second word is ${words[1]}"
declare -p words # print the whole array
done

0 pour la réponse № 5

Je suis tombé sur cette question et les réponses proposées, mais je ne vois pas cette solution simple possible:

for word in `cat inputfile`
do
echo $word
done

0 pour la réponse № 6

En bash, utilisez simplement l’espace comme séparateur (read -d " "). Cette méthode nécessite un prétraitement pour traduire les nouvelles lignes en espaces (en utilisant tr) et de fusionner plusieurs espaces en un seul (en utilisant sed):

{
tr "n" " " | sed "s/  */ /g" | while read -d " " WORD
do
echo -n "<${WORD}> "
done
echo
} << EOF
Here you have some words, including * wildcards
that don"t get expanded,
multiple   spaces   between   words,
and lines with spaces at the begining.
EOF

Le principal avantage de cette méthode est que vous n’avez pas besoin de vous soucier de la syntaxe des tableaux et que vous travaillez comme avec un for boucle, mais sans expansion générique.