168 votes

contenu du fichier dans une variable unix avec des nouvelles lignes

J'ai un fichier texte test.txt avec le contenu suivant:
text1
text2

Et je veux assigner le contenu du fichier à une variable UNIX 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 proposer une solution pour cela?

241voto

paxdiablo Points 341644

L'affectation ne supprime pas les caractères de nouvelle ligne, c'est en fait le echo fait. Vous devez simplement mettre des guillemets autour de la chaîne pour conserver ces nouvelles lignes:

 echo "$testvar"
 

Cela donnera le résultat que vous voulez. Voir la transcription suivante pour une démo:

 pax> cat num1.txt
line 1
line 2

pax> x=$(cat num1.txt)

pax> echo $x
line 1 line 2

pax> echo "$x"
line 1
line 2

pax> echo "$x" >num2.txt

pax> cat num2.txt
line 1
line 2

pax> diff num1.txt num2.txt

pax> _
 

13voto

DVK Points 63282

Ceci est dû à la variable IFS (Internal Field Separator) qui contient une nouvelle ligne.

 $ cat xx1
1
2

$ A=`cat xx1`
$ echo $A
1 2

$ echo "|$IFS|"
|       
|
 

Une solution de contournement consiste à réinitialiser IFS pour ne pas contenir la nouvelle ligne, temporairement :

 $ IFSBAK=$IFS
$ IFS=" "
$ A=`cat xx1` # Can use $() as well
$ echo $A
1
2
$ IFS=$IFSBAK
 

10voto

todd Points 31

Bash -ge 4 a le mapfile intégré pour lire les lignes de l’entrée standard dans une variable tableau.

 help mapfile 

mapfile < file.txt lines
printf "%s" "${lines[@]}"

mapfile -t < file.txt lines    # strip trailing newlines
printf "%s\n" "${lines[@]}" 
 

Voir également:

http://bash-hackers.org/wiki/doku.php/commands/builtin/mapfile

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X