Contenu du fichier dans unix variable avec des sauts de ligne
J'ai un fichier texte test.txt avec le contenu suivant:
text1
text2
Et je veux attribuer le contenu du fichier dans un UNIX variable, mais quand je fais ceci:
testvar=$(cat test.txt)
echo $testvar
le résultat est:
text1 text2
au lieu de
text1
text2
Quelqu'un peut-il me suggérer une solution pour cela?
- UNIX est un système d'exploitation, pas un langage de programmation. Quelle langue parlez-vous? Les scripts Shell?
Vous devez vous connecter pour publier un commentaire.
La cession ne pas supprimer les caractères de saut de ligne, c'est en fait la
echo
faire. Vous devez tout simplement mettre des guillemets autour de la chaîne à conserver les retours à la ligne:Cette wil donner le résultat que vous souhaitez. Voir la transcription suivante pour une démo:
La raison pourquoi retours à la ligne sont remplacés par des espaces n'est pas entièrement à voir avec la
echo
de commande, c'est plutôt une combinaison de choses.Lorsque la ligne de commande,
bash
divise en mots selon la documentation de laIFS
variable:Qui spécifie que, par défaut, aucune de ces trois caractères peuvent être utilisés pour diviser votre commande en mots individuels. Après cela, les séparateurs de mots ont disparu, tout ce que vous avez à gauche est une liste de mots.
Combinez cela avec la
echo
de la documentation (unbash
commande interne), et vous verrez pourquoi les espaces sont de sortie:Lorsque vous utilisez
echo "$x"
, il force l'ensemble de lax
variable à un unique parole, selonbash
, c'est pas divisé. Vous pouvez le voir avec:Ici, le
count
fonction simplement imprime le nombre d'arguments donnés. Le1 2 3
eta b c d
variantes montrent en action.Ensuite, nous avons essayer avec les deux variations sur le
x
variable. L'un sans citations montre qu'il y a quatre mots,"test"
,"1"
,"test"
et"2"
. Ajouter les guillemets rend un seul mot"test 1\ntest 2"
.Bash -ge 4 a le mapfile builtin de lire des lignes à partir de l'entrée standard dans un tableau de variables.
Voir aussi:
http://bash-hackers.org/wiki/doku.php/commands/builtin/mapfile
Cela est dû à IFS (Internal Field Separator) variable qui contient le saut de ligne.
Une solution de contournement est de rétablir l'IFS ne pas contenir le caractère de saut de ligne, temporairement:
De REVENIR sur cette horrible changement pour les FI:
Juste si quelqu'un est intéressé par une autre option:
Votre variable est correctement définie par
testvar=$(cat test.txt)
. Pour afficher cette variable qui se composent de caractères de nouvelle ligne, il suffit d'ajouter des guillemets, par exempleIci est l'exemple complet:
La
envdir
utilitaire fournit un moyen facile de le faire.envdir
utilise des fichiers pour représenter les variables d'environnement, avec des noms de fichier de mappage à l'env var noms et le contenu du fichier de mappage à l'env var valeurs. Si le contenu du fichier contient des retours à la ligne, il en sera de l'env var.Voir https://pypi.python.org/pypi/envdir