J'ai un fichier comme ça:
one
two
three
four
Je voudrais utiliser une boucle for dans un script bash afin d'analyser la ligne du fichier pour la ligne. Auparavant, j'utilisais cut
mais je ne pouvais pas donner à la commande cut
le délimiteur de nouvelle ligne, comment puis-je cela?
De cette façon, cela ne fonctionne pas:
cut -d'\n' -f1
Toute suggestion ?
Utilisez cat
pour concaténer ou afficher. Pas besoin de ça ici:
while read line ; do
echo "$line"
done < file
Je me suis retrouvé dans le même problème, cela fonctionne pour moi:
cat file.cut | cut -d$'\n' -f1
Ou:
cut -d$'\n' -f1 file.cut
Utilisez simplement:
echo -n `cut ...`
Cela supprime le\n à la fin
Donc, de très bonnes réponses (éventuellement meilleures) ont déjà été fournies. Mais en regardant le libellé de la question initiale, en voulant utiliser une boucle BASH, je me suis étonné que personne ne mentionnait une solution avec le changement de Field Separator IFS. C'est une solution pure bash, tout comme la ligne de lecture acceptée
old_IFS=$IFS
IFS='\n'
for field in $(<filename)
do your_thing;
done
IFS=$old_IFS
cat FILE|while read line; do # 'line' is the variable name
echo "$line" # do something here
done
ou (voir commentaire):
while read line; do # 'line' is the variable name
echo "$line" # do something here
done < FILE
Si vous êtes certain que la sortie sera toujours délimitée par des lignes, utilisez head -n 1
au lieu de cut -f1
(notez que vous avez mentionné une boucle for dans un script et que votre question n'était pas liée au script).
Beaucoup d'autres réponses, y compris celle acceptée, comportent plusieurs lignes inutilement. Pas besoin de faire cela sur plusieurs lignes ou de changer le délimiteur par défaut sur le système.
De plus, la solution fournie par Ivan avec -d$'\n'
ne fonctionnait pas pour moi, que ce soit sur Mac OSX ou CentOS 7. Étant donné que sa réponse a quatre ans, je suppose que quelque chose a dû changer dans la logique du caractère $
pour cette situation.