Sous Linux, pour supprimer le retour chariot, nous pouvons exécuter:
sed -i 's/\r//g' <file>
Mais la même chose ne fonctionnera pas sur Mac OS X. Besoin de faire précéder $
comme:
sed -i $'s/\r//' <file>
Et "g" n'est pas non plus nécessaire.
Pourquoi cela est-il ainsi?
C'est parce que sed
disponible sur OSX ne reconnaît pas \r
comme un caractère spécial contrairement au sed
sous Linux.
Vous pouvez soit l'utiliser comme vous l'utilisez:
sed -i.bak $'s/\r//' file
Ou ca:
sed -i.bak "s/$(printf '\r')//" file
OU sinon vous pouvez utiliser tr
sur OSX:
tr -d '\r' < file
Une autre solution portable et flexible est:
sed -i.bak $'s/\x0D//' file
Parce que le caractère de retour a le code ASCII 0D. Les substitutions\x fonctionnent pour toutes les versions POSIX de sed, et vous pouvez faire correspondre tout autre caractère gênant en recherchant le code ASCII. Pour trouver d'autres substitutions valides, exécutez man re_format
Ou affichez un Table ASCII .
Le/g final est nécessaire pour Linux car le retour chariot (\ r) ne termine pas la ligne. De nombreux éditeurs "texte brut" Windows (par exemple, le Bloc-notes) terminent chaque ligne avec un retour chariot et une nouvelle ligne (\ r\n), mais les Mac avec OS 9 ( ca. 2001 ) ou une version antérieure terminaient chaque ligne d'un fichier "texte brut" avec un seul\r. Si vous nettoyez un fichier Windows, le/g n'est nécessaire sur aucun système * X. Si vous êtes sur macOS, le/g n'est pas nécessaire non plus, car macOS reconnaît le single\r comme une fin de ligne.
(Un système Linux lisant un ancien fichier Mac pensera que tout le texte est sur une très longue ligne et ne convertit que le premier\r. Si vous êtes sur un système Linux et devez conserver les sauts de ligne d'un ancien fichier Mac,
sed -i.bak $'s/\x0D/\x0A/g' file
convertit chacun\r en\n.)