2009-10-05 9 views
10

J'essaie de faire le contraire de this question, en remplaçant les fins de ligne Unix avec les fins de ligne Windows, de sorte que je peux use SQL Server bcp over samba to import the file. J'ai sed installé mais pas dos2unix. J'ai essayé d'inverser les exemples mais en vain.Remplacer n avec r n dans le fichier Unix

Voici la commande que j'utilise.

sed -e 's/\n/\r\n/g' myfile 

Je puis exécuté ce couru od -c myfile, attendant de voir \r\n où il y avait \n. Mais là tout encore \n. (Ou du moins, ils semblent l'être.) La sortie de od déborde de mon tampon d'écran, donc je ne vois pas le début du fichier).

Je n'ai pas été capable de comprendre ce que je fais mal. Aucune suggestion?

+0

Vous n'avez pas de compilateur disponible? –

+0

Quel genre de compilateur? –

+0

pour voir le haut du fichier: od -c filename | moins –

Répondre

11
  • Quel est le problème à obtenir dos2unix sur la machine?
  • Sur quelle plate-forme travaillez-vous?
  • Avez-vous GNU sed ou non-GNU standard sed?

Sur Solaris, /usr/bin/sed nécessite:

sed 's/$/^M/' 

où je suis entré dans le '^ M' en tapant contrôleVcontrôleM. Le '$' correspond à la fin de la ligne, et remplace la fin de la ligne par le contrôle-M. Vous pouvez aussi écrire cela.

mécanismes pour développer sed attendent « \r » ou « \\r » pour contrôler-M vont être spécifiques à la plate-forme, au mieux.

+0

Cela a fait l'affaire. Je pourrais être en mesure d'obtenir dos2unix là-bas, mais j'espérais utiliser un logiciel existant. Je suis sur AIX. Je suppose que c'est la version non-GNU. Maintenant que vous le mentionnez, j'ai déjà utilisé le contrôle-v-control-m dans vi auparavant, j'aurais dû y penser. Merci. –

-1

Peut-être que si vous essayez cette façon

cat myfile | sed 's/\n/\r\n/g' > myfile.win 

fonctionnera, si je comprends bien votre juste faire les remplacements à la sortie de la console, vous devez rediriger la sortie vers un fichier, dans ce cas myfile.win, alors vous pouvez simplement le renommer comme vous voulez. Le script entier serait (en cours d'exécution dans un répertoire complet de ce type de fichiers):

#!/bin/bash 
for file in $(find . -type f -name '*') 
do 
    cat $file | sed 's/\n/\r\n/g' > $file.new 
    mv -f $file.new $file 
done 
+1

-1. ça ne marche pas pour moi. – Peter

+0

bien est spécifique à la plate-forme, la réponse de Jonathan Leffler est mieux – Juparave

3

Vous n'avez pas besoin de l'option -e.

$ correspond au caractère de fin de ligne. Cette commande sed va insérer un caractère \r avant la fin de la ligne:

sed 's/$/\r/' myfile 
+1

Merci pour la suggestion, mais pour une raison quelconque, il suffit de coller un r à la fin du fichier. –

+0

Selon le manuel d'information de GNU sed: "Toutes les échappées présentées ici sont des extensions GNU, à l'exception de \ n". ". – hlovdal

+0

Ma faute pour ne pas spécifier la saveur Unix. J'utilise AIX. +1 pour être le premier à signaler que je devrais rechercher $ au lieu de \ n. –

13

Face à cela, j'utiliser un simple perl one-liner:

perl -pi -e 's/\n/\r\n/' filename 

parce que le comportement varie sed, et je sais que cela fonctionne.

+0

Oui, c'est la meilleure option portable. Les développements^M entrés à la main et peu fiables sont des exemples. –

1

simple ajout d'une \r (alias ^M, voir la réponse de Jonathan Leffler) devant \n n'est pas sûr parce que le fichier pourrait avoir mode mixte EOL, alors vous risquez de se retrouver avec quelques lignes becomming \r\r\n. La chose sûre à faire est d'abord enlever tous les caractères '\ r', puis insérer (un seul) \r avant \n.

#!/bin/sh 
sed 's/^M//g' ${1+"[email protected]"} | sed 's/$/^M/' 

Mis à jour pour utiliser ^M.

0

Essayez d'utiliser:

echo " this is output" > input 
sed 's/$/\r/g' input |od -c 
1
sed 's/\([^^M]\)$/\0^M/' your_file 

Ceci assure que vous n'insérez un \ r quand il n'y a pas \ r avant \ n. Cela a fonctionné pour moi.

Questions connexes