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?
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.
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.
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
.)
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$
.
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.
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.
Version abrégée: _file -k somefile.txt
_ vous le dira.
with CRLF line endings
_ pour les fins de ligne DOS/Windows.with LF line endings
_ pour les fins de ligne MAC.text
. (Ainsi, s'il ne mentionne explicitement aucun type de _line endings
_, cela signifie implicitement: "fins de ligne CR".)Version longue voir ci-dessous.
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.
man file
man dos2unix
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.
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
.
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.