Supprimer un retour chariot dans Unix
Quelle est la façon la plus simple de supprimer tous les retours chariot \r
à partir d'un fichier sous Unix?
- Vous parlez soit '\r' '\n', ou tout simplement le méchant '\r?
- Connexes: grep pour rechercher des fichiers qui contiennent des ^M (Windows retour chariot).
Vous devez vous connecter pour publier un commentaire.
Je vais supposer que vous entendez des retours chariot (CR,
"\r"
,0x0d
) à la se termine de lignes plutôt que de simplement aveuglément dans un fichier (vous pouvez les avoir dans le milieu de cordes pour tout ce que je sais). L'utilisation de ce fichier de test avec un CR à la fin de la première ligne:dos2unix
est le chemin à parcourir s'il est installé sur votre système:Si pour une raison quelconque
dos2unix
n'est pas disponible pour vous, alorssed
va le faire:Si pour une raison quelconque
sed
n'est pas disponible pour vous, alorsed
va le faire, d'une manière compliquée:Si vous n'avez pas tout de ces outils est installé sur votre boîte, vous avez plus de problèmes que d'essayer de convertir les fichiers 🙂
\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 seulementprintf "\r"
semble fonctionner.sed
exemple pas comme prévu, étant donné que le match expression comprend les \n, qui est pas partie de la chaîne correspondant à l'encontre? En d'autres termes: ne devrait-il pas êtresed 's/\r$//'
?sed "s/$(printf '\r')\$//"
$
comme suit:sed $'s@\r@@g' |od -c
(mais si vous devez le remplacer avec\n
vous auriez besoin de s'en échapper)cat pp/index.php | sed -e 's/\r$//' | od -c
. @paxdiablo, mettez-vous à jour de votre réponse à la bonne sed expression?CTRL-V + CTRL-M
en place de\r
ressemble à cela pourrait fonctionner.find . -type f -exec sed -i 's/\r$//' {} \;
Voir tr(1)
tr
ne prend pas en charge la\r
évasion, essayez'\015'
ou peut-être un littéral'^M'
(dans de nombreuses coquilles sur de nombreux terminaux, ctrl-V ctrl-M va produire un littéral ctrl-M de caractères).outfile = infile
?De La Vieille École:
Il y a un utilitaire appelé dos2unix qui existe sur de nombreux systèmes, et peut être facilement installé sur la plupart des.
La façon la plus simple sur Linux est, à mon humble avis,
La forte citations autour de la substitution de l'opérateur
's/\r//'
sont essentiel. Sans eux, le shell va interpréter\r
comme une évasion+r et de le réduire à un simpler
, et de supprimer toutes les minusculesr
. C'est pourquoi la réponse donnée ci-dessus en 2009 par Rob ne fonctionne pas.Et en ajoutant le
/g
modificateur assure que même plusieurs\r
seront supprimés, et pas seulement le premier.sed -i s/\r//<filename>
ou somesuch; voirman sed
ou la richesse des informations disponibles sur le web concernant l'utilisation desed
.Une chose à noter est la signification précise de "retour chariot" dans le ci-dessus; si vous avez vraiment dire le seul caractère de contrôle retour chariot", puis le motif ci-dessus est correcte. Si vous signifiait, plus généralement, CRLF (retour chariot et un saut de ligne, qui est de savoir comment les sauts de ligne sont mis en œuvre sous Windows), alors vous voudrez probablement pour remplacer
\r\n
à la place. Nu sauts de ligne (newline) sous Linux/Unix sont\n
.s/\r//
ne semble pas supprimer les retours chariot sur OS X, il semble supprimer littéraler
caractères à la place. Je ne sais pas pourquoi c'est encore. Peut-être qu'il a quelque chose à voir avec la façon dont la chaîne est cité? Comme solution de contournement, à l'aide deCTRL-V + CTRL-M
en place de\r
semble fonctionner.Si vous êtes un utilisateur de Vi, vous pouvez ouvrir le fichier et de supprimer le retour chariot avec:
ou avec
Notez que vous devez taper ^M en appuyant sur ctrl-v, puis ctrl-m.
^M
-s à tous. Se déplacer c'est une tonne de touches, ce qui n'est pas ce que vim est fait pour ;). Je venais de passer poursed -i
, puis `-e 's/\r$//g' pour limiter le déplacement de la CRs à EOL.Une fois de plus une solution... Car il y a toujours un de plus:
C'est agréable parce que c'est en place et fonctionne dans toutes les saveurs de unix/linux, j'ai travaillé avec.
Quelqu'un d'autre vous recommandons de
dos2unix
et je le recommande vivement ainsi. Je suis juste fournir plus de détails.S'il est installé, passez à l'étape suivante. Si ce n'est déjà installé, je vous recommande de l'installer via
yum
comme:Alors vous pouvez l'utiliser comme:
Voici la chose,
%0d
est le caractère de retour chariot. Pour le rendre compatabile avec Unix. Nous avons besoin d'utiliser la commande ci-dessous.dos2unix fileName.extension fileName.extension
essayez ceci pour convertir fichier dos vers unix fichier:
Si vous utilisez un système d'exploitation (comme OS X) qui n'ont pas la
dos2unix
de commande, mais ne disposent d'un interpréteur Python (version 2.5+), cette commande est équivalente à lados2unix
commande:Ce gère à la fois les fichiers nommés sur la ligne de commande ainsi que les tubes et redirections, tout comme
dos2unix
. Si vous ajoutez cette ligne à votre ~/.bashrc fichier (ou l'équivalent fichier de profil pour d'autres shells):... la prochaine fois que vous vous connectez (ou exécuter
source ~/.bashrc
dans la session en cours), vous serez en mesure d'utiliser ledos2unix
nom sur la ligne de commande de la même manière que dans les autres exemples.Pour UNIX... j'ai remarqué dos2unix retiré Unicode en-têtes de mes fichiers UTF-8. Sous git bash (Windows), le script suivant semble fonctionner bien. Il utilise sed. Remarque il ne supprime transport-retour à la fin des lignes, et préserve Unicode en-têtes.
Si vous exécutez un X à l'environnement et d'avoir un bon éditeur de code de visual studio), alors je voudrais suivre le reccomendation:
Le Code de Visual Studio: Comment faire pour afficher les fins de ligne
Juste aller dans le coin inférieur droit de votre écran, le code de visual studio va vous montrer à la fois l'encodage et à la fin de la ligne convention suivie par le fichier, un juste avec un simple clic, vous pouvez passer autour de.
Suffit d'utiliser le code visuel que votre remplacement pour notepad++ dans un environnement linux et vous êtes prêt à aller.
J'ai utilisé python pour elle, voici mon code;
Si c'est un vieux poste, récemment, j'ai retrouvé avec le même problème. Comme j'avais tous les fichiers à renommer à l'intérieur de /tmp/blah_dir/chaque fois qu'un fichier dans ce répertoire a "/r" de fuite de caractères ( montrant des "?" à la fin du fichier), et le faire façon script a été seulement je pouvais penser.
Je voulais enregistrer des fichiers avec le même nom (sans fuite n'importe quel caractère).
Le sed, le problème était le nom de fichier de sortie qui on avait besoin de moi pour parler de quelque chose d'autre ( dont je ne voulais pas).
J'ai essayé d'autres options comme suggéré ici (pas considérés comme dos2unix en raison de certaines limitations), mais n'a pas fonctionné.
J'ai essayé avec "awk", enfin, qui a travaillé pour lequel j'ai utilisé "\r" comme délimiteur et pris la première partie:
truc, c'est:
Ci-dessous extrait de script que j'ai utilisé ( où j'ai eu tous les fichier "\r", comme le suiveur de caractères dans le chemin /tmp/blah_dir/) pour résoudre mon problème:
Remarque: Cet exemple n'est pas très exacte, si proche de ce que j'ai travaillé (Mentionner ici juste pour donner la meilleure idée de ce que j'ai fait)
vous pouvez simplement faire ceci :
a * b
...