Ho letto questa domanda su come leggere n caratteri da un file di testo usando bash. Mi piacerebbe sapere come leggere una parola alla volta da un file che assomiglia a:
example text
example1 text1
example2 text2
example3 text3
Qualcuno può spiegarmelo o mostrarmi un esempio facile? Grazie!
risposte:
9 per risposta № 1Il read
comando di default legge intere righe. Quindi la soluzione è probabilmente quella di leggere l'intera riga e quindi dividerla su spazi bianchi con ad es. for
:
while read line; do
for word in $line; do
echo "word = "$word""
done
done
15 per risposta № 2
Il modo per farlo con gli input standard è passare il -a
bandiera da leggere:
read -a words
echo "${words[@]}"
Questo leggerà l'intera riga in una variabile di array indicizzata, in questo caso denominata parole. È quindi possibile eseguire qualsiasi operazione su array che ti piace parole con espansioni dei parametri shell.
Per le operazioni orientate ai file, le versioni correnti di Bash supportano anche il mapfile incassato. Per esempio:
mapfile < /etc/passwd
echo ${MAPFILE[0]}
In ogni caso, gli array sono la strada da percorrere. Vale la pena dedicare tempo a familiarizzare Sintassi dell'array Bash per sfruttare al massimo questa funzione.
6 per risposta № 3
Normalmente, dovresti leggere da un file usando a while read -r line
ciclo continuo. Per fare questo e analizzare le parole sulle linee è necessario nidificare a for
loop all'interno del while
ciclo continuo.
Ecco una tecnica che funziona senza richiedere cicli annidati:
for word in $(<inputfile)
do
echo "$word"
done
3 per risposta № 4
Nel contesto indicato, dove è noto il numero di parole:
while read -r word1 word2 _; do
echo "Read a line with word1 of $word1 and word2 of $word2"
done
Se vuoi leggere ogni riga in un array, read -a
metterà la prima parola nell'elemento 0 del tuo array, il secondo nell'elemento 1, ecc:
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 per risposta № 5
Ho trovato questa domanda e le risposte proposte, ma non vedo elencato questa semplice soluzione possibile:
for word in `cat inputfile`
do
echo $word
done
0 per risposta № 6
In bash, basta usare lo spazio come delimitatore (read -d " "
). Questo metodo richiede un po 'di pre-elaborazione per tradurre le newline in spazi (usando tr
) e per unire più spazi in uno solo (usando 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
Il vantaggio principale di questo metodo è che non devi preoccuparti della sintassi dell'array e lavorare come con for
loop, ma senza espansione con caratteri jolly.