2009-12-11 8 views
1

Je suis en train d'analyser certains fichiers .html dans Bash. J'ai lu l'entrée avec:Lire le fichier ligne par ligne dans Bash développe les caractères spéciaux

while read line 
do 
    echo $line 
    ...do something... 
done < $file 

Maintenant j'ai expier quelque chose de vraiment étrange. Quelques lignes dans les fichiers contiennent quelque chose comme

Resolution…: 720 * 576 

Mais bash me donne ceci:

Resolution…: 720 mysript.sh another_script.pl 576 

Bash élargit le * char au contenu du répertoire réel. Comment puis-je lire le texte ligne par ligne sans expansion.

Répondre

8

l'expansion se produit dans echo, pas read, vous devez indiquer votre sortie:

echo "$line" 
+0

Merci beaucoup, J'ai été aveugle – cb0

+0

Cette réponse est incorrecte! Pour "sourceFile" contenant "RewriteRule^(. *) \. [\ D] {10} \. (Css | js) $ $ 1. $ 2 [L]" cat sourceFichier | en ligne de lecture; echo "$ {line}" produit RewriteRule^(. *). [d] {10}. (css | js) $ $ 1. $ 2 [L] WRONG alors que la même commande avec read -r ligne produit RewriteRule^(. *) \. [\ d] {10} \. (css | js) $ $ 1. $ 2 [L] CORRECT – Pancho

+0

@catwalk -mon excuses - comme ci-dessous j'ai confondu deux choses donc probablement les deux réponses sont corrects – Pancho

5

vous devriez lire votre fichier comme celui-ci, avec l'option -r

while read -r line 
do 
    echo "$line" 
    #..do something... 
done < "$file" 
+0

Ceci est une bonne pratique, mais elle résout un problème différent: elle désactive l'interprétation des antislashs (par exemple, sans elle, read traitera une barre oblique inverse à la fin d'une ligne d'entrée comme un marqueur de continuation). –

Questions connexes