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/
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. »
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.
Alternativement, (la version cygwin de) Perl -pe
ne semble pas avoir ce problème.
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
J'ai trouvé que sed-4.4.exe
de https://github.com/mbuilov/sed-windows est une pure victoire, car
-b
-i
en place-z
avec des délimètres \0
au lieu de \n
qui peut être utile parfois tooVoir 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
.