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 (
CRLF
ouLF
). Comment le découvrir?
linux
bash
command-line
newline
line-endings
Marco Ceppi
la source
la source
man less
.Réponses:
Vous pouvez utiliser l'
file
utilitaire pour vous donner une indication du type de fins de ligne.Unix:
"DOS":
Pour convertir de "DOS" en Unix:
Pour convertir d'Unix en "DOS":
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.
la source
tofrodos
paquet avecsudo apt-get install tofrodos
- tout comme vous auriez à exécutersudo apt-get install dos2unix
pour obtenirdos2unix
etunix2dos
.dos2unix
échoue? Le PO à cette question ne décrit que vaguement le problème.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
\n
ou\r\n
dansvi
, 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,
bash
vous pouvez utiliserod -t c <filename>
ou simplementod -c <filename>
afficher les retours.la source
:set fileformat
indiquera lequelunix
oudos
vim pense que les fins de ligne du fichier sont dedans. Vous pouvez le changer par:set fileformat=unix
.od -t c file/path
, mais merci pour le nouveau programme. Fonctionne très bien!Ubuntu 14.04:
simple ,
cat -e <filename>
fonctionne très bien.Cela affiche les fins de ligne Unix (
\n
ou LF) en tant que$
et les fins de ligne Windows (\r\n
ou CRLF) en tant que^M$
.la source
.txt
fichier)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 -v
visualise les caractères\r
(CR). comme^M
. Ainsi, les\r\n
séquences de fin de ligne s'affichent comme^M
à la fin de chaque ligne de sortie.cat -e
visualisera également\n
, à savoir comme$
. (cat -et
permet également de visualiser les caractères des onglets. as^I
.)la source
echo -e 'abc\ndef\r\n' | cat -v
et vous devriez voir un^M
après la "def".Pour afficher CR comme
^M
moins utiliséless -u
ou taper -uune fois moins est ouvert.man less
dit:la source
Essayez
file
alorsfile -k
alorsdos2unix -ih
file
sera généralement suffisant. Mais pour les cas difficiles, essayezfile -k
oudosunix -ih
.Détails ci-dessous.
Essayer
file -k
Version courte:
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
. (Donc, s'il ne mentionne explicitement aucun type,line endings
cela 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
: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
dos2unix
avec le--info
commutateur comme ceci: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-k
pour faire court) dansfile
:Excellent! Nous savons maintenant que notre fichier impair a des
CRLF
fins de ligne DOS ( ). (Et les autres fichiers ont desLF
fins de ligne Unix ( ). Ce n'est pas explicite dans cette sortie. C'est implicite. C'est juste la façon dontfile
un 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:
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:Et un autre moment "en fait": Le format d'en-tête est vraiment facile à retenir: voici deux mnémoniques:
Lectures complémentaires
man file
man dos2unix
la source
Accounts.java: Java source, ASCII text\012-
sur Windows dans MinTTYfile -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
cat -e file_to_test
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.la source
Vous pouvez utiliser la commande
todos filename
pour convertir en fins DOS etfromdos filename
pour convertir en fins de ligne UNIX. Pour installer le package sur Ubuntu, tapezsudo apt-get install tofrodos
.la source
Vous pouvez utiliser
vim -b filename
pour 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\n
et 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 lafileformats
configuration 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.
la source
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.
la source
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
:Cela fera interpréter à vim chaque fichier que vous ouvrez comme un fichier unix. Étant donné
\n
que les fichiers Unix ont le caractère de nouvelle ligne, un fichier Windows avec un caractère de nouvelle ligne\r\n
sera toujours rendu correctement (grâce au\n
) mais aura^M
à la fin du fichier (c'est ainsi que vim rend le\r
caractè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=unix
lors de la modification d'un fichier donné.Vim - toujours afficher le type de fichier (
unix
vsdos
)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
statusline
avecset statusline+=\ %{&fileencoding?&fileencoding:&encoding}
.Ma ligne d'état complète est fournie ci-dessous. Ajoutez-le simplement à votre
.vimrc
.Ça rendra comme
au bas de votre dossier
Vim - affiche parfois le type de fichier (
unix
vsdos
)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 reviendraunix
pour les fichiers Unix etdos
pour Windows.la source