Comment trouver les fins de ligne dans un fichier texte?

304

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 vidage de SSIS / SQL Server lu par une machine Linux pour le traitement.

  • Y a-t- il des commutateurs dans vi, less, more, etc?

  • En plus de voir les fins de ligne, j'ai besoin de savoir de quel type de fin de ligne il s'agit ( CRLFou LF). Comment le découvrir?

Marco Ceppi
la source
1
Conseil général: si vous avez une idée de la commande * nix / cygwin que vous pourriez utiliser, vous pouvez toujours afficher sa page de manuel pour rechercher des commutateurs qui pourraient vous offrir les fonctionnalités dont vous avez besoin. Par exemple, man less.
David Rivers

Réponses:

421

Vous pouvez utiliser l' fileutilitaire pour vous donner une indication du type de fins 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 d'Unix en "DOS":

$ unix2dos testfile1.txt

La conversion d'un fichier déjà converti n'a aucun effet, il est donc sûr de s'exécuter à l'aveugle (c'est-à-dire sans tester d'abord le format) bien que les clauses de non-responsabilité habituelles s'appliquent, comme toujours.

En pause jusqu'à nouvel ordre.
la source
9
Ceux-ci sont désormais parfois nommés "fromdos" et "todos", respectivement (comme c'est le cas dans Ubuntu 10.4+)
Jess Chadwick
3
@JessChadwick: Oui, mais seulement si vous installez explicitement le tofrodospaquet avec sudo apt-get install tofrodos- tout comme vous auriez à exécuter sudo apt-get install dos2unixpour obtenir dos2unixet unix2dos.
mklement0
En fait, dos2unix ne peut pas faire tout le travail, je pense que stackoverflow.com/questions/23828554/dos2unix-doesnt-convert-m donne la meilleure réponse
nathan
@nathan: À quoi dos2unixéchoue? Le PO à cette question ne décrit que vaguement le problème.
pause jusqu'à nouvel ordre.
La commande de fichier @DennisWilliamson avant et après la commande dos2unix a obtenu la même sortie: source xxx.c C, texte ASCII, avec CR, terminateurs de ligne LF. J'ai trouvé que ce fichier c a ^ M au milieu de la ligne qui aime xxxxxxx ^ M xxxxxxx
nathan
127

Dans vi...

:set list pour voir les fins de ligne.

:set nolist pour revenir à la normale.

Bien que je ne pense pas que vous puissiez voir \nou \r\ndans vi, vous pouvez voir de quel type de fichier il s'agit (UNIX, DOS, etc.) pour en déduire les terminaisons de ligne qu'il contient ...

:set ff

Alternativement, bashvous pouvez utiliser od -t c <filename>ou simplement od -c <filename>afficher les retours.

Ryan Berger
la source
26
Malheureusement, je ne pense pas que vi puisse montrer ces personnages spécifiques. Vous pouvez essayer od -c <nomfichier> qui, je crois, affichera \ n ou \ r \ n.
Ryan Berger
3
Dans la catégorie "pour ce que ça vaut", vous pouvez rechercher le CRLF de style Dos en émettant grep --regex = "^ M" où ^ M est CTRL + V CTRL + M. Vous pouvez les supprimer en remplaçant ceux par une commande sed. Cela fait essentiellement la même chose que dos2unix
cowboydan
11
Dans vim: :set fileformatindiquera lequel unixou dosvim pense que les fins de ligne du fichier sont dedans. Vous pouvez le changer par :set fileformat=unix.
Victor Zamanian
5
Utilisez l'indicateur -b lors du démarrage de vi / vim, puis utilisez: set list pour voir les terminaisons CR (^ M) et LF ($).
Samuel
1
@RyanBerger - On dirait que vous manquez un -t. Ça devrait l'être od -t c file/path, mais merci pour le nouveau programme. Fonctionne très bien!
Eric Fossum
113

Ubuntu 14.04:

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

Cela affiche les fins de ligne Unix ( \nou LF) en tant que $et les fins de ligne Windows ( \r\nou CRLF) en tant que ^M$.

Alexander Shelemin
la source
7
Fonctionne également sur OSX. Bonne solution. Simple et a fonctionné pour moi alors que la réponse acceptée ne l'a pas fait. (Remarque: n'était pas un .txtfichier)
dlsso
4
l'affichage de M $ est-il un dénouement easteregg / windows?
Tom M
Ne fonctionne pas avec Solaris, mais l'homme dit que cela aurait dû fonctionner
Zeus
101

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

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

Note de l'éditeur: cat -vvisualise les caractères \r(CR). comme ^M. Ainsi, les \r\nséquences de fin de ligne s'affichent comme ^Mà la fin de chaque ligne de sortie. cat -evisualisera également \n, à savoir comme $. ( cat -etpermet également de visualiser les caractères des onglets. as ^I.)

warriorpostman
la source
3
@ChrisK: Essayez echo -e 'abc\ndef\r\n' | cat -vet vous devriez voir un ^Maprès la "def".
pause jusqu'à nouvel ordre.
Je voulais voir si le fichier avait ^ M (Windows / DOS EOL) et seul cat -v me l'a montré. +1 pour cela
Ali
1
^ M = style DOS / Windows
Mercury
correction: Ainsi, les séquences de fin de ligne \ r \ n s'afficheront comme ^ M $
Shayan
19

Pour afficher CR comme ^Mmoins utilisé less -uou taper -uune 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.
P. Kucerak
la source
1
Veuillez clarifier votre réponse.
adao7000
12

Essayez filealors file -kalorsdos2unix -ih

filesera généralement suffisant. Mais pour les cas difficiles, essayez file -kou dosunix -ih.

Détails ci-dessous.


Essayer file -k

Version courte: file -k somefile.txt vous le dira.

  • Il sortira with CRLF line endingspour les fins de ligne DOS / Windows.
  • Il sortira with LF line endingspour les fins de ligne MAC.
  • Et pour la ligne Linux / Unix "CR", il sortira simplement text. (Donc, s'il ne mentionne explicitement aucun type, line endingscela signifie implicitement: "fins de ligne CR" .)

Version longue voir ci-dessous.


Exemple concret: Encodage de certificats

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

Le problème avec régulier file est le suivant: Parfois, il essaie d'être trop intelligent / trop spécifique.

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

(Soit dit en passant: voici à quoi ressemble 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. Il ne me dit pas les fins de ligne. Et je savais déjà qu'il s'agissait de fichiers cert. Je n'avais pas besoin de "fichier" pour me le dire.

Que pouvez-vous essayer d'autre?

Vous pouvez essayer dos2unixavec le --infocommutateur 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, cela vous dit que: oui, "0.example.end.cer" doit être l'homme étrange. Mais quel genre de fins de ligne existe-t-il? Connaissez- vous le format de sortie dos2unix par cœur? (Je ne.)

Mais heureusement, il y a l' option --keep-going(ou -kpour faire court) 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 CRLFfins de ligne DOS ( ). (Et les autres fichiers ont des LFfins de ligne Unix ( ). Ce n'est pas explicite dans cette sortie. C'est implicite. C'est juste la façon dont fileun fichier texte "normal" devrait l'être.)

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

Convertissons maintenant le coupable et réessayons:

$ 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.

Essayer dos2unix -ih

Je ne le savais pas quand j'écrivais l'exemple ci-dessus mais:

En fait, il s'avère que dos2unix vous donnera une ligne d'en-tête si vous utilisez -ih(abréviation de --info=h) comme ceci:

$ dos2unix -ih -- *
 DOS    UNIX     MAC  BOM       TXTBIN  FILE
   0      37       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

Et un autre moment "en fait": Le format d'en-tête est vraiment facile à retenir: voici deux mnémoniques:

  1. C'est DUMB (de gauche à droite: d pour Dos, u pour Unix, m pour Mac, b pour BOM).
  2. Et aussi: "DUM" est juste l'ordre alphabétique de D, U et M.

Lectures complémentaires

StackzOfZtuff
la source
1
Il génère une sortie comme: Accounts.java: Java source, ASCII text\012-sur Windows dans MinTTY
autonome le
@standalone: ​​intéressant. J'ai lu des choses étranges sur une option appelée "igncr" - et ce que vous dites sonne comme ça. Mais je ne peux pas reproduire ce que vous décrivez. (J'ai essayé à l'intérieur de Bash inside mintty fourni avec Git-for-Windows, "git version 2.24.0.windows.1".)
StackzOfZtuff
Hm, j'ai essayé file -k Accounts.javaà l'intérieur du mintty qui vient avec git-for-windows aussi, mais ma version estgit version 2.21.0.windows.1
stand alone
La solution de travail pour moi estcat -e file_to_test
autonome le
9

Vous pouvez utiliser xxdpour 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.

Riches
la source
1
Cela fonctionne pour moi avec cat v 8.23. Les fins de ligne Unix n'imprimeront aucune information supplémentaire, mais les fins de ligne DOS imprimeront un "^ M".
Rich
Ce doit être ce que je rencontre avec 8.21, étant donné que j'utilise des fins de ligne unix.
neanderslob
5

Vous pouvez utiliser la commande todos filenamepour convertir en fins DOS et fromdos filenamepour convertir en fins de ligne UNIX. Pour installer le package sur Ubuntu, tapez sudo apt-get install tofrodos.

Zorayr
la source
5

Vous pouvez utiliser vim -b filenamepour modifier un fichier en mode binaire, qui affichera des caractères ^ M pour le retour chariot et une nouvelle ligne indique la présence de LF, indiquant les fins de ligne CRLF Windows. Par LF je veux dire \net par CR je veux dire \r. Notez que lorsque vous utilisez l'option -b, le fichier sera toujours modifié 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 termineront par LF, pas CRLF. Si vous utilisez vim normal sans -b sur un fichier avec des fins de ligne CRLF, vous devriez voir [dos]apparaître dans la ligne d'état et les lignes insérées auront CRLF comme fin de ligne. La documentation de vim pour la fileformatsconfiguration explique les complexités.

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

smalers
la source
0

Je vide ma sortie dans un fichier texte. Je l'ouvre ensuite dans notepad ++ puis je clique sur le bouton Afficher tous les caractères. Pas très élégant mais ça marche.

Diego
la source
3
Cette question est étiquetée comme Linux et je ne pense pas que notepad ++ soit pour linux. Cela devrait cependant fonctionner pour Windows.
Rick Smith
0

Vim - affiche toujours les nouvelles lignes de Windows sous ^M

Si vous préférez toujours voir les sauts de ligne Windows dans le rendu vim ^M, vous pouvez ajouter cette ligne à votre .vimrc:

set ffs=unix

Cela fera interpréter à vim chaque fichier que vous ouvrez comme un fichier unix. Étant donné \nque les fichiers Unix ont le caractère de nouvelle ligne, un fichier Windows avec un caractère de nouvelle ligne \r\nsera toujours rendu correctement (grâce au \n) mais aura ^Mà la fin du fichier (c'est ainsi que vim rend le \rcaractère).


Vim - affiche parfois les nouvelles lignes de Windows

Si vous préférez simplement le définir fichier par fichier, vous pouvez l'utiliser :e ++ff=unixlors de la modification d'un fichier donné.


Vim - toujours afficher le type de fichier ( unixvs dos)

Si vous voulez que la dernière ligne de Vim affiche toujours le type de fichier que vous modifiez (et que vous n'avez pas forcé de définir le type de fichier sur Unix), vous pouvez l'ajouter à votre statuslineavec
set statusline+=\ %{&fileencoding?&fileencoding:&encoding}.

Ma ligne d'état complète est fournie ci-dessous. Ajoutez-le simplement à votre .vimrc.

" Make statusline stay, otherwise alerts will hide it
set laststatus=2
set statusline=
set statusline+=%#PmenuSel#
set statusline+=%#LineNr#
" This says 'show filename and parent dir'
set statusline+=%{expand('%:p:h:t')}/%t
" This says 'show filename as would be read from the cwd'
" set statusline+=\ %f
set statusline+=%m\
set statusline+=%=
set statusline+=%#CursorColumn#
set statusline+=\ %y
set statusline+=\ %{&fileencoding?&fileencoding:&encoding}
set statusline+=\[%{&fileformat}\]
set statusline+=\ %p%%
set statusline+=\ %l:%c
set statusline+=\ 

Ça rendra comme

.vim/vimrc\                                    [vim] utf-8[unix] 77% 315:6

au bas de votre dossier


Vim - affiche parfois le type de fichier ( unixvs dos)

Si vous voulez simplement voir quel type de fichier vous avez, vous pouvez l'utiliser :set fileformat(cela ne fonctionnera pas si vous avez forcé de définir le type de fichier ). Il reviendra unixpour les fichiers Unix et dospour Windows.

jeremysprofile
la source