web-dev-qa-db-fra.com

Comment trouver des fins de lignes dans un fichier texte?

J'essaie d'utiliser quelque chose dans bash pour me montrer les fins de ligne dans un fichier imprimé plutôt qu'interprété. Le fichier est un cliché de SSIS/SQL Server en cours de lecture par une machine Linux.

  • Existe-t-il des commutateurs dans vi, less, more, etc.?

  • En plus de voir les fins de ligne, j'ai besoin de savoir quel type de fin de ligne il s'agit (CRLF ou LF). Comment puis-je savoir cela?

248
Marco Ceppi

Vous pouvez utiliser l'utilitaire file pour vous donner une indication du type de fin de ligne.

Unix:

$ file testfile1.txt
testfile.txt: ASCII text

"DOS":

$ file testfile2.txt
testfile2.txt: ASCII text, with CRLF line terminators

Pour convertir de "DOS" en Unix:

$ dos2unix testfile2.txt

Pour convertir Unix en "DOS":

$ unix2dos testfile1.txt

La conversion d’un fichier déjà converti n’ayant aucun effet, l’exécution en aveugle est donc sûre (c’est-à-dire sans tester le format au préalable), bien que les clauses de non-responsabilité habituelles s’appliquent, comme toujours.

357
Dennis Williamson

Dans vi...

:set list pour voir les fins de lignes.

:set nolist pour revenir à la normale.

Bien que je ne pense pas que vous puissiez voir \n ou \r\n dans vi, vous pouvez voir quel type de fichier (UNIX, DOS, etc.) indiquer quelle ligne se termine a...

:set ff

Alternativement, à partir de bash, vous pouvez utiliser od -t c <filename> ou seulement od -c <filename> pour afficher les retours.

120
Ryan Berger

Dans le shell bash, essayez cat -v <filename>. Cela devrait afficher des retours chariot pour les fichiers Windows.

(Cela a fonctionné pour moi dans rxvt via Cygwin sous Windows XP).

Note de l'éditeur: cat -v visualise \r (CR) caractères. comme ^M. Ainsi, les séquences \r\n de fin de ligne s'afficheront sous la forme ^M à la fin de chaque ligne de sortie. cat -e visualisera en outre \n, notamment sous la forme $. (cat -et visualisera en plus les caractères de tabulation comme ^I.)

96
warriorpostman

Ubuntu 14.04:

simple cat -e <filename> fonctionne très bien.

Ceci affiche les fins de ligne Unix (\n ou LF) sous la forme $ et les fins de ligne Windows (\r\n ou CRLF) sous la forme ^M$.

89
Alexander Shelemin

Pour afficher CR en tant que ^M en moins, utilisez less -u ou tapez -u une fois moins est ouvert.

man less dit:

-u or --underline-special

      Causes backspaces and carriage returns to be treated  as  print-
      able  characters;  that  is,  they are sent to the terminal when
      they appear in the input.
14
P. Kucerak

Vous pouvez utiliser xxd pour afficher un vidage hexadécimal du fichier et rechercher les caractères "0d0a" ou "0a".

Vous pouvez utiliser cat -v <filename> comme le suggère @warriorpostman.

9
Rich

Essayez "file -k"

Version abrégée: _file -k somefile.txt_ vous le dira.

  • Il générera _with CRLF line endings_ pour les fins de ligne DOS/Windows.
  • Il générera _with LF line endings_ pour les fins de ligne MAC.
  • Et pour la ligne "CR" de Linux/Unix, le résultat sera simplement text. (Ainsi, s'il ne mentionne explicitement aucun type de _line endings_, cela signifie implicitement: "fins de ligne CR".)

Version longue voir ci-dessous.


Application dans le monde réel: encodage de certificat

Je dois parfois vérifier cela pour les fichiers de certificat PEM.

Le problème avec file normal est le suivant: il essaie parfois d’être trop intelligent/trop spécifique.

Essayons un petit quiz: j'ai des fichiers. Et l'un de ces fichiers a des fins de ligne différentes. Laquelle?

(A propos: voici à quoi ressemble l'un de mes répertoires typiques de "travail de certificat").]

Essayons régulièrement file:

_$ file -- *
0.example.end.cer:         PEM certificate
0.example.end.key:         PEM RSA private key
1.example.int.cer:         PEM certificate
2.example.root.cer:        PEM certificate
example.opensslconfig.ini: ASCII text
example.req:               PEM certificate request
_

Huh. Cela ne me dit pas les fins de ligne. Et j'ai déjà savait ​​que c'étaient des fichiers de cert. Je n'avais pas besoin de "fichier" pour me le dire.

Quoi d'autre pouvez-vous essayer?

Vous pouvez essayer _dos2unix_ avec le commutateur _--info_ comme ceci:

_$ dos2unix --info -- *
  37       0       0  no_bom    text    0.example.end.cer
   0      27       0  no_bom    text    0.example.end.key
   0      28       0  no_bom    text    1.example.int.cer
   0      25       0  no_bom    text    2.example.root.cer
   0      35       0  no_bom    text    example.opensslconfig.ini
   0      19       0  no_bom    text    example.req
_

Donc, ça vous dit que: ouais, "0.example.end.cer" doit être l'homme étrange à l'extérieur. Mais quel genre de fins de lignes existe-t-il? Est-ce que vous connaissez le format de sortie de dos2unix par cœur? (Je ne.)

Mais heureusement, il y a l'option _--keep-going_ (ou _-k_ en abrégé) dans file:

_$ file --keep-going -- *
0.example.end.cer:         PEM certificate\012- , ASCII text, with CRLF line terminators\012- data
0.example.end.key:         PEM RSA private key\012- , ASCII text\012- data
1.example.int.cer:         PEM certificate\012- , ASCII text\012- data
2.example.root.cer:        PEM certificate\012- , ASCII text\012- data
example.opensslconfig.ini: ASCII text\012- data
example.req:               PEM certificate request\012- , ASCII text\012- data
_

Excellent! Nous savons maintenant que notre fichier impair a des fins de ligne DOS (CRLF). (Et les autres fichiers ont des fins de ligne Unix (LF). Ce n'est pas explicite dans cette sortie. C'est implicite. C'est juste la façon dont file s'attend à un fichier texte "normal".

[Si vous voulez partager mon mnémonique: "L" est pour "Linux" et pour "LF".)

Convertissons maintenant le coupable et essayons à nouveau:

_$ dos2unix -- 0.example.end.cer

$ file --keep-going -- *
0.example.end.cer:         PEM certificate\012- , ASCII text\012- data
0.example.end.key:         PEM RSA private key\012- , ASCII text\012- data
1.example.int.cer:         PEM certificate\012- , ASCII text\012- data
2.example.root.cer:        PEM certificate\012- , ASCII text\012- data
example.opensslconfig.ini: ASCII text\012- data
example.req:               PEM certificate request\012- , ASCII text\012- data  
_

Bien. Désormais, tous les certificats ont des fins de ligne Unix.

Lectures complémentaires

8
StackzOfZtuff

Vous pouvez utiliser vim -b filename pour éditer un fichier en mode binaire, qui affichera ^ M caractères pour le retour à la ligne et une nouvelle ligne indique la présence de LF, indiquant les fins de ligne de Windows CRLF. Par LF je veux dire \n et par CR je veux dire \r. Notez que lorsque vous utilisez l'option -b, le fichier sera toujours édité en mode UNIX par défaut, comme indiqué par [unix] dans la ligne d'état, ce qui signifie que si vous ajoutez de nouvelles lignes, elles se terminent par LF, et non par CRLF. Si vous utilisez vim normal sans -b sur un fichier avec des fins de ligne CRLF, vous devriez voir [dos] apparaître sur la ligne d'état et les lignes insérées porteront CRLF en fin de ligne. La documentation vim pour le paramètre fileformats explique les complexités.

De plus, je n'ai pas assez de points pour commenter la réponse du Notepad ++, mais si vous utilisez Notepad ++ sous Windows, utilisez le menu Afficher/Afficher le symbole/Afficher la fin de la ligne pour afficher CR et LF. Dans ce cas, LF est affiché alors que pour vim, LF est indiqué par une nouvelle ligne.

4
smalers

Vous pouvez utiliser la commande todos filename pour convertir les fins DOS, et fromdos filename pour convertir les fins de ligne UNIX. Pour installer le paquet sur Ubuntu, tapez Sudo apt-get install tofrodos.

4
Zorayr

Je vole ma sortie dans un fichier texte. Je l'ouvre ensuite dans le bloc-notes ++, puis cliquez sur le bouton Afficher tous les caractères. Pas très élégant mais ça marche.

0
Diego