Comment lire la ligne complète dans la boucle 'for' avec des espaces

89

J'essaie d'exécuter une boucle for pour le fichier et je veux afficher la ligne entière. Mais au lieu de cela, il affiche uniquement le dernier mot. Je veux la ligne complète.

for j in 'cat ./file_wget_med'

do
echo $j

done

résultat après exécution:

Found.

Voici mes données:

$ cat file_wget_med
2013-09-11 14:27:03 ERROR 404: Not Found.
    
posée user192118 11.09.2013 - 21:49
la source

4 réponses

129

for loop se sépare lorsqu'il voit des espaces tels que space, tab ou newline. Donc, vous devriez utiliser IFS (Séparateur de champ interne) :

IFS=$'\n'       # make newlines the only separator
for j in $(cat ./file_wget_med)    
do
    echo "$j"
done
    
réponse donnée Radu Rădeanu 11.09.2013 - 22:26
la source
66

for loops scindé par défaut sur n'importe quel espace (espace, tabulation, nouvelle ligne); Le moyen le plus simple de travailler sur une ligne à la fois consiste à utiliser à la place une boucle while read , qui se divise sur les nouvelles lignes:

while read i; do echo "$i"; done < ./file_wget_med

Je voudrais attendre votre commande pour cracher un mot par ligne (c'est ce qui s’est passé lorsque je l’ai testé avec un fichier personnel). Si quelque chose d'autre se passe, je ne suis pas sûr de ce qui pourrait en être la cause.

    
réponse donnée evilsoup 11.09.2013 - 22:04
la source
16
#!/bin/bash
files='find <subdir> -name '*''
while read -r fname; do
    echo $fname
done <<< "$files"

Un travail vérifié, pas le paquebot que vous voulez probablement, mais il est impossible de le faire avec élégance.

    
réponse donnée Mitchell Currie 02.11.2016 - 07:34
la source
2

Voici une petite extension de la réponse de Mitchell Currie, que j'aime bien en raison de la faible portée des effets secondaires, ce qui évite de devoir définir une variable:

#!/bin/bash
while read -r fname; do
    echo $fname
done <<< "'find <subdir> -name '*''"
    
réponse donnée Dandalf 07.06.2018 - 17:57
la source

Lire d'autres questions sur les étiquettes