web-dev-qa-db-fra.com

Suppression du retour chariot sur Mac OS X à l'aide de sed

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?

17
Gaurav Fotedar

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
32
anubhava

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.)

8
William H. Hooper