Quelle est la façon la plus simple de supprimer tous les retours chariot \r
d'un fichier sous Unix?
unix
carriage-return
Aldur
la source
la source
Réponses:
Je vais supposer que vous moyenne des retours chariot ( CR,
"\r"
,0x0d
) aux extrémités des lignes plutôt que aveuglément dans un fichier (vous pouvez les avoir au milieu des cordes pour tout ce que je sais). Utilisation de ce fichier de test avec un CRà la fin de la première ligne uniquement:dos2unix
est le chemin à parcourir s'il est installé sur votre système:Si, pour une raison quelconque
dos2unix
, vous n'êtes pas disponible, voussed
le ferez:Si, pour une raison quelconque
sed
, vous n'êtes pas disponible, alorsed
le ferez, de manière compliquée:Si aucun de ces outils n'est installé sur votre box, vous avez de plus gros problèmes que d'essayer de convertir des fichiers :-)
la source
\r
ne fonctionne qu'avec GNU sed, sinon vous pouvez le faire:sed `echo "s/\r//"`
sed
niecho
reconnaître\r
sur MacOs. Dans ce cas, cela neprintf "\r"
semble fonctionner.sed "s/$(printf '\r')\$//"
$
comme ceci:sed $'s@\r@@g' |od -c
(mais si vous le remplacez,\n
vous devrez l'échapper)CTRL-V + CTRL-M
à la place de\r
cela pourrait fonctionner.Voir tr (1)
la source
tr
ne prend pas en charge l'\r
échappement, essayez'\015'
ou peut-être un littéral'^M'
(dans de nombreux shells sur de nombreux terminaux, ctrl-V ctrl-M produira un caractère littéral ctrl-M).outfile = infile
?someProg <in >out && mv out in
.Vieille école:
la source
Le moyen le plus simple sous Linux est, à mon humble avis,
Les citations fortes autour de l'opérateur de substitution
's/\r//'
sont essentielles . Sans eux, le shell interprétera\r
comme un escape + r et le réduira à une plainer
, et supprimera tous les minusculesr
. C'est pourquoi la réponse donnée ci-dessus en 2009 par Rob ne fonctionne pas.Et l'ajout du
/g
modificateur garantit que même plusieurs\r
seront supprimés, et pas seulement le premier.la source
Il existe un utilitaire appelé dos2unix qui existe sur de nombreux systèmes et peut être facilement installé sur la plupart.
la source
sed -i s/\r// <filename>
ou quelque chose comme ça; voirman sed
ou la richesse des informations disponibles sur le Web concernant l'utilisation desed
.Une chose à souligner est la signification précise de "retour chariot" dans ce qui précède; si vous voulez vraiment dire le caractère de contrôle unique "retour chariot", alors le modèle ci-dessus est correct. Si vous vouliez dire, plus généralement, CRLF (retour chariot et un saut de ligne, qui est la façon dont les sauts de ligne sont implémentés sous Windows), alors vous voudrez probablement le remplacer à la
\r\n
place. Les sauts de ligne nus (newline) sous Linux / Unix le sont\n
.la source
s/\r//
ne semble pas supprimer les retours chariot sur OS X, il semble supprimer lesr
caractères littéraux à la place. Je ne sais pas encore pourquoi. Peut-être que cela a quelque chose à voir avec la façon dont la chaîne est citée? Comme solution de contournement, l'utilisationCTRL-V + CTRL-M
à la place de\r
semble fonctionner.Si vous êtes un utilisateur Vi, vous pouvez ouvrir le fichier et supprimer le retour chariot avec:
ou avec
Notez que vous devez taper ^ M en appuyant sur ctrl-v puis sur ctrl-m.
la source
^M
-s. Contourner cela est une tonne de frappes, ce qui n'est pas ce pour quoi Vim est fait;). J'irais juste poursed -i
, puis `-e 's / \ r $ // g' pour limiter la suppression aux CR à EOL.Une fois de plus une solution ... Parce qu'il y en a toujours une de plus:
C'est bien parce qu'il est en place et fonctionne dans toutes les saveurs d'Unix / Linux avec lesquelles j'ai travaillé.
la source
Quelqu'un d'autre le recommande
dos2unix
et je le recommande fortement également. Je fournis juste plus de détails.S'il est installé, passez à l'étape suivante. S'il n'est pas déjà installé, je recommanderais de l'installer via
yum
comme:Ensuite, vous pouvez l'utiliser comme:
la source
Si vous utilisez un OS (comme OS X) qui n'a pas la
dos2unix
commande mais qui a un interpréteur Python (version 2.5+), cette commande est équivalente à lados2unix
commande:Cela gère les fichiers nommés sur la ligne de commande ainsi que les canaux et les redirections, tout comme
dos2unix
. Si vous ajoutez cette ligne à votre fichier ~ / .bashrc (ou fichier de profil équivalent pour d'autres shells):... la prochaine fois que vous vous connecterez (ou exécuterez
source ~/.bashrc
dans la session en cours), vous pourrez utiliser ledos2unix
nom sur la ligne de commande de la même manière que dans les autres exemples.la source
Voici la chose,
%0d
est le caractère de retour chariot. Pour le rendre compatible avec Unix. Nous devons utiliser la commande ci-dessous.dos2unix fileName.extension fileName.extension
la source
essayez ceci pour convertir le fichier dos en fichier unix:
la source
Pour UNIX ... J'ai remarqué que dos2unix a supprimé les en-têtes Unicode de mon fichier UTF-8. Sous git bash (Windows), le script suivant semble bien fonctionner. Il utilise sed. Notez qu'il supprime uniquement les retours chariot à la fin des lignes et préserve les en-têtes Unicode.
la source
Si vous utilisez un environnement X et disposez d'un éditeur approprié (code Visual Studio), je suivrais la recommandation:
Code Visual Studio: comment afficher les fins de ligne
Il suffit d'aller dans le coin inférieur droit de votre écran, le code de Visual Studio vous montrera à la fois l'encodage du fichier et la convention de fin de ligne suivie par le fichier, un simple clic vous permet de changer cela.
Utilisez simplement du code visuel pour remplacer notepad ++ sur un environnement Linux et vous êtes prêt à partir.
la source
Notepad++
la commande deEdit / EOL Conversion / Unix (LF)
sur votre système Windows avant de copier le fichier sur votre système Linux.Suppression
\r
sur n'importe quel système UNIX®:La plupart des solutions existantes dans cette question sont spécifiques à GNU et ne fonctionneraient pas sur OS X ou BSD; les solutions ci-dessous devraient fonctionner sur de nombreux autres systèmes UNIX, et dans n'importe quel shell, de
tcsh
àsh
, tout en fonctionnant même sur GNU / Linux.Testé sur OS X, OpenBSD et NetBSD dans
tcsh
, et sur Debian GNU / Linux dansbash
.Avec
sed
:Dans
tcsh
un OS X, l'sed
extrait de code suivant pourrait être utilisé avecprintf
, comme nised
niecho
gérer\r
de la manière spéciale comme le fait GNU:Avec
tr
:Une autre option est
tr
:Différence entre
sed
ettr
:Il semblerait que
tr
conserve un manque de retour à la ligne de fin du fichier d'entrée, alors quesed
sur OS X et NetBSD (mais pas sur OpenBSD ou GNU / Linux) insère un retour à la ligne à la fin du fichier même si l'entrée manque à la fin\r
ou\n
à la toute fin du fichier.Essai:
Voici quelques exemples de tests qui pourraient être utilisés pour s'assurer que cela fonctionne sur votre système, en utilisant
printf
ethexdump -C
; alternativement,od -c
pourrait également être utilisé si votre système est manquanthexdump
:la source
J'ai utilisé python pour ça, ici mon code;
la source
Bien que ce soit un post plus ancien, je suis récemment tombé sur le même problème. Comme j'avais tous les fichiers à renommer dans / tmp / blah_dir / car chaque fichier dans ce répertoire avait un caractère de fin "/ r" (montrant "?" À la fin du fichier), donc le faire de manière script était la seule chose à laquelle je pouvais penser.
Je voulais enregistrer le fichier final avec le même nom (sans laisser de caractère). Avec sed, le problème était le nom du fichier de sortie dont j'avais besoin pour mentionner autre chose (dont je ne voulais pas).
J'ai essayé d'autres options comme suggéré ici (non considéré comme dos2unix en raison de certaines limitations) mais je n'ai pas fonctionné.
J'ai finalement essayé avec "awk" qui fonctionnait là où j'ai utilisé "\ r" comme délimiteur et pris la première partie :
l'astuce est:
Ci-dessous l'extrait de script que j'ai utilisé (où j'avais tout le fichier avait "\ r" comme caractère de fin dans path / tmp / blah_dir /) pour résoudre mon problème:
Remarque: Cet exemple n'est pas très exact mais proche de ce que j'ai travaillé (mentionner ici juste pour donner une meilleure idée de ce que j'ai fait)
la source
J'ai fait ce shell-script pour supprimer le caractère \ r. Il fonctionne en solaris et red-hat:
la source
vous pouvez simplement faire ceci:
la source
a * b
...