web-dev-qa-db-fra.com

Préserver les fins de ligne

Je lance sed pour effectuer des substitutions sur Windows et je constate qu’il convertit automatiquement les fins de ligne en Unix (\ n). Existe-t-il une option pour indiquer à sed d’utiliser les fins de ligne Windows (\ r\n) ou même mieux de conserver les fins de ligne du fichier?

Note: J'utilise sed d'Unxutils: http://unxutils.sourceforge.net/

96
Bogdan Calmac

Vous pouvez utiliser l'option -b pour que sed le traite comme un fichier binaire. Cela résoudra le problème lié au fichier sed de cygwin sous Windows. 

Exemple: sed -b 's/foo/bar/'

Si vous souhaitez faire correspondre la fin de la ligne, pensez à faire correspondre, capturer et copier le retour à la ligne facultatif.

Exemple: sed -b 's/foo\(\r\?\)$/bar\1/'

De la page de manuel sed

-b --binary

Cette option est disponible sur toutes les plateformes, mais n’est efficace que lorsque le système d’exploitation fait la distinction entre les fichiers texte et les fichiers binaires. Lorsqu'une telle distinction est faite (comme c'est le cas pour MS-DOS, Windows, Cygwin), les fichiers texte sont composés de lignes séparées par un retour chariot et un caractère de saut de ligne, et sed ne voit pas le CR final. Lorsque cette option est spécifiée, sed ouvrira les fichiers d’entrée en mode binaire, ne demandant donc pas ce traitement spécial et considérant que les lignes se terminent par un saut de ligne. » 

126
Shlomo

Vous pouvez essayer de placer le \n pour \r\n à la fin de votre script existant, comme ceci:

sed 's/foo/bar/;s/$/\r/'

ou peut-être

 sed -e 's/foo/bar/' -e 's/$/\r/'

Si aucune des deux solutions ci-dessus ne fonctionne, vous devrez consulter la page de manuel relative à votre version de sed pour voir si une telle option existe. Notez que les versions * nix de sed ne pas modifient les fins de ligne sans qu'il vous soit demandé de le faire.

Une autre alternative consiste à utiliser la version cygwin de sed qui ne devrait pas avoir ce comportement indésirable.

10
SiegeX

Alternativement, (la version cygwin de) Perl -pe ne semble pas avoir ce problème.

6
seeker

Gnuwin peut être supprimé pour gâcher les nouvelles lignes (win-> unix) si vous spécifiez uniquement le commutateur -b et la redirection. Utiliser le commutateur -i (inline) va tout gâcher.

Par exemple. sed.exe -b "s/\ xFF\xFE //" c:\temp\in.csv> c:\temp\out.csv

1
buckley

J'ai trouvé que sed-4.4.exe de https://github.com/mbuilov/sed-windows est une pure victoire, car

  • utilise les fins de ligne Windows CRLF en mode par défaut
  • conserve les fins de ligne d'origine en mode -b
  • fonctionne correctement avec le mode -i en place
  • offre également le mode -z avec des délimètres \0 au lieu de \n qui peut être utile parfois too

Voir aussi liste des options sed et liste de tous les ports Windows sed .

Notez que gnuwin32 sed 4.2.1 est les fins de ligne corrompues en mode -bi et qu’il n’a pas du tout de mode -z.

0
Vadzim