Outils pour utilisateurs

Outils du site


enseignement:lea:cours:informatique:linux:text-file

Unix pour linguistes : fichiers textes

Le shell

Généralités

Un fichier texte contient des caractères (imprimables en général ;-)). On peut afficher le contenu d'un fichier avec cat(1) :

$ cat /tmp/file
plop
$

Le fichier /tmp/file contient une ligne de 5 caractères : p l o p suivi d'un caractère de fin de ligne. Si je supprime ce caractère de fin de ligne, j'obtiens :

$ cat /tmp/file
plop$

Noter que le prompt s'affiche à la suite de la chaîne plop et non pas en début de ligne.

cat(1) est une commande simple, les scientifiques diraient : « c'est la fonction Identité ». En effet, cat(1) (concatenate) prend ce qu'on lui donne et le restitue tel quel.

Il faut se convaincre, si ça n'est pas déjà le cas, que cat(1) affiche tous les caractères du fichier, qu'il s'agisse d'un fichier texte, d'un fichier GIF ou MP3 ou whatever.

Si vous n'avez jamais pratiqué que les logiciels de traitement de textes comme Microsoft Word ou OpenOffice Writer, vous devez comprendre que ces logiciels ne font pas « une (seule) chose mais très bien » :

  • ils permettent la mise en forme (traitement de textes proprement dit),
  • ils permettent aussi l'édition (ajout, suppression de caractères)

et ils mélangent joyeusement les deux notions / activités.

Dans le contexte qui nous occupe, il n'y a plus de notion de gras ou d'italique.

Il faut voir un fichier comme une suite finie de caractères, caractères imprimables ou non. Ces caractères sont :

  • des lettres a, b, etc. ou leur équivalent en majuscule A, B, etc. (il s'agit de caractères différents),
  • des chiffres 0, 1, etc.
  • des symboles +, -, etc.
  • des signes de ponctuations :, ;, etc.
  • des signes de parenthésage {, [, etc.
  • des caractères d'espacement : l'espace, la tabulation (en règle générale, s'affiche alors un retrait de 8 caractères) et la fin de ligne
  • des caractères non-imprimables (souvent appelés caractères de contrôle) ; voir Caractères de contrôle utiles.

En général, le terminal utilise une fonte à chasse fixe : tous les caractères ont la même chasse. La notion typographique de quadratin n'a ici aucune valeur. Ainsi, la largeur de la lettre i ou du . sera la même que celle de la lettre m. C'est particulièrement adapté pour aligner du texte verticalement. D'ailleurs, le lecteur attentif aura déjà noté que ces pages font un usage immodéré de fonte à chasse fixe.

De même, un fichier texte ne contenant que des caractères, ces derniers ne sauraient être ni soulignés ou gras ni non plus en fonte Times ou 14 points, ni encore moins en rouge sur fond jaune… : un fichier texte ne contient aucune mise en forme.

Types de fichiers

Comme vous le savez sûrement déjà, il existe de nombreux types de fichiers. Si vous ne comprenez rien à ce charabia, allez d'urgence (re)lire les notes sur les formats de fichiers.

La commande file(1) vous indique de quel type est tel fichier :

$ file expl1.pdf
expl1.pdf: PDF document, version 1.4
$ file expl2.sh
expl2.sh Bourne shell script text executable
$ file expl3.jpg
3.jpg: JPEG image data, JFIF standard 1.02
$ file expl4.txt
expl4.txt: ASCII text
$ file expl5.txt
expl5.txt: ISO-8859 text
$ file expl6.txt
expl6.txt: UTF-8 Unicode text

Les extensions des noms de fichiers ci-dessus (.pdf, .sh, .jpg, .txt, etc.) ne sont là que pour nous aider à savoir ce que l'on manipule. On peut renommer le fichier expl1.pdf en expl1.txt :

$ mv expl1.pdf expl1.txt ; file expl1.txt
expl1.txt: PDF document, version 1.4

Cela n'a évidemment rien changé au contenu du fichier, en particulier son format (PDF et non pas texte) n'a pas changé (autrement dit on a peint du plomb en jaune mais il ne s'est pas transformé en or pour autant).

Les accents

On vient de voir dans l'exemple précédent trois types différents de fichiers textes.

Rappels

Un caractère peut représenter des lettres, chiffres, ponctuation, espacements et des caractères de contrôle ; il est représenté dans l'ordinateur par un nombre (son code), cf. Le codage. Sa représentation à l'écran est un glyphe.

ASCII

Fichier sans accent. Ni ç. Ni rien que des lettres « normales », des chiffres et de la ponctuation. Ces fichiers sont dit ASCII, ce sont ceux qui ne vous poseront jamais de problèmes, ils sont lisibles par tous les systèmes que vous manipulerez.

Le codage ASCII se fait sur des nombres de 7 bits ; comme 27 = 128, on ne peut donc stocker que 128 caractères (de 0 à 127).

Code ASCII :

#!/usr/bin/perl
# P. Cabaud
printf "Characters table\n";
$i = 0;
printf "\t%d", $i++ while $i < 8;
printf "\n"; printf "-" x 66;
 
printf "\n" . "%4d|\t", 0;
$i = 0;
while ($i < 127) {
        $i < 32 ? printf "%x\t", $i : printf "%c\t", $i;
        printf "\n" . "%4d|\t", $i if ($i % 8 == 7);
        $i++;
}

ISO-8859-1*

Les ennuis commencent quand on veut mettre des accents. ISO-8859-1 permet de représenter les langues d'Europe occidentale. ISO-8859-15 ajoute le support du symbole .

Le codage ISO-8859-* se fait sur des nombres de 8 bits ; comme 28 = 256, on ne peut donc stocker que 256 caractères (de 0 à 255). Il étend l'ASCII en ce sens que les 128 premiers codes sont identiques.

UTF

Les ennuis continuent de plus belle avec UTF-8 (Unicode) que votre terminal — s'il n'est pas UTF-compliant — aura du mal à gérer. Ce codage permet de représenter les 216 i. e. 65536 caractères possibles d'Unicode (actuellement autour de 50000 utilisés).

C'est là qu'on peut voir qu'une commande comme cat(1) affiche bien tout sur le terminal : sur un terminal « classique » (non UTF-compliant), vous verrez les accents en deux caractères.

Il existe essentiellement 3 normes UTF pour stocker du texte en Unicode : UTF-8, UTF-16 et UTF-32. Les trois étendent l'ASCII i. e. reprennent les 128 premiers codes à l'identique.

  • UTF-8 permet de coder le texte avec des caractères pesants 1 à 4 octets (8 à 32 bits) ;
  • UTF-16 permet de coder les caractères sur 2 ou 4 octets (16 ou 32 bits) ;
  • UTF-32 permet de coder les caractères sur 4 octets (32 bits).

Pour les langues européennes, UTF-8 est la plus appropriée.

Changement d'encodage

La commande iconv(1) permet de changer le codage. Elle admet les options -f (from) et -t (to) :

$ iconv -f utf-8 -t latin1 expl6.txt > expl6_iso.txt
$ file expl6.txt expl6_iso.txt
expl6.txt:     Unicode text, UTF-8
expl6_iso.txt: ISO-8859 text

L'option -l permet de lister les codages connus par iconv(1) et utilisables avec -f et -t.

Fins de lignes

Apple, Microsoft et les différents systèmes Unix ont chacun leur manière de marquer les fins de ligne.

Type Marquage de fin ligne Format
Apple Carriage Return \r
Microsoft Carriage Return suivi de Line Feed i. e. CR + LF \r\n
Unix Line Feed i. e. LF \n

Une nouvelle fois on peut admirer d'une part l'effort de normalisations des constructeurs et d'autre part que le mot « économie » ne fait pas partie du vocabulaire en vogue chez Microsnot.

Dans votre terminal, pour taper \r aka ^M vous pouvez utiliser Ctrl-V suivi de Ctrl-M. Vous pouvez aussi consulter la page Caractères de contrôle utiles.


Répertoires et fichiers

enseignement/lea/cours/informatique/linux/text-file.txt · Dernière modification: 2011/11/06 15:19 par Helene Beciri