328 votes

Remplacer la virgule par un saut de ligne dans sed sous MacOS ?

J'ai un fichier d'identifiants séparés par des virgules. J'essaie de remplacer les virgules par une nouvelle ligne. J'ai essayé :

sed 's/,/\n/g' file

mais cela ne fonctionne pas. Que me manque-t-il ?

13 votes

Essayez tr , '\n' . Je suppose, sed traite \n comme du texte brut.

1 votes

Ça a marché ! cat file | tr , ' \n '

8 votes

tr , '\n' < file - pas de tuyau.

397voto

Prince John Wesley Points 22418

Utilisez tr à la place :

tr , '\n' < file

0 votes

Je cherchais à remplacer le point '.', et c'est la solution que je cherchais :)

1 votes

Il ne fonctionne pas dans le shell bash $ tr , ' \n ' aitr utilisation : tr [-Ccsu] string1 string2 tr [-Ccu] -d string1 tr [-Ccu] -s string1 tr [-Ccu] -ds string1 string2

5 votes

Remplacer une virgule par un point-virgule fonctionne également : tr ',' ';' < input.csv > output.csv

340voto

Walter Mundt Points 9160

Utilisez un Chaîne citée ANSI-C $'string'

Vous avez besoin d'un backslash-escaped literal newline pour arriver à sed. Dans bash au moins, $'' Les chaînes de caractères remplaceront \n avec une vraie nouvelle ligne, mais vous devez alors doubler la barre oblique inverse que sed verra pour échapper à la nouvelle ligne, par ex.

echo "a,b" | sed -e $'s/,/\\\n/g'

Note cela ne fonctionnera pas sur toutes les coquilles mais elle fonctionnera sur les plus courantes.

6 votes

Étrange, il fonctionne également avec une barre oblique inverse en moins, à savoir echo "a,b" | sed -e $'s/,/\\n/g .

2 votes

Approuvé. Pour plus d'informations, consultez la section "CITATION" du site Web de l'UE. man bash .

8 votes

J'ai réussi à le faire fonctionner avec OSX 10.11 : sed -E $'s/<\\/br>/\\\n/g' file pas besoin d'installer gnu-sed

132voto

Max Nanasy Points 1322
sed 's/,/\
/g'

fonctionne sur Mac OS X.

3 votes

Merci pour cela - Je me demandais pourquoi mon ancienne astuce linux ne fonctionnait pas sous OSX. Mais ça marche !

6 votes

C'est la seule solution qui fonctionne dans un script sed.

6 votes

Notez que la barre oblique inversée s'échappe le saut de ligne littéral (pour qu'il ne soit pas un terminateur de commande) : il est pas un caractère de continuation de ligne (comme dans bash, etc.). Pour voir la différence, essayez d'écrire la commande ci-dessus sans les guillemets : la barre oblique inversée sera interprétée par l'interpréteur de commandes comme un caractère de continuation de ligne et elle et la nouvelle ligne seront ignorées. Inversement, incluez le contenu de l'expression citée (sans guillemets) dans un fichier séparé comma-to-newline.sed (qui élimine la syntaxe de l'interpréteur de commandes), et ça marche !

25voto

nar8789 Points 31

Si votre utilisation de sed tend à être entièrement constituée d'expressions de substitution (comme c'est le cas pour moi), vous pouvez également utiliser perl -pe au lieu de

$ echo 'foo,bar,baz' | perl -pe 's/,/,\n/g'
foo,
bar,
baz

15voto

user177073 Points 84

Apparemment \r est la clé !

$ sed 's/, /\r/g' file3.txt > file4.txt

Transformé ceci :

ABFS, AIRM, AMED, BOSC, CALI, ECPG, FRGI, GERN, GTIV, HSON, IQNT, JRCC, LTRE,
MACK, MIDD, NKTR, NPSP, PME, PTIX, REFR, RSOL, UBNT, UPI, YONG, ZEUS

A ceci :

ABFS
AIRM
AMED
BOSC
CALI
ECPG
FRGI
GERN
GTIV
HSON
IQNT
JRCC
LTRE
MACK
MIDD
NKTR
NPSP
PME
PTIX
REFR
RSOL
UBNT
UPI
YONG
ZEUS

0 votes

Je sais que la question dit OS X, mais cela ne fonctionne pas avec GNU sed-4.2.2-6.fc20.x86_64.

11 votes

Gardez à l'esprit que \r n'est pas la même chose que \n et cela pourrait empêcher la manipulation et l'utilisation ultérieures des données.

3 votes

Désolé, ça n'a pas marché pour moi. J'ai juste un 'r' là où il devrait y avoir un saut de ligne.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X