Remplacez la virgule par une nouvelle ligne dans sed

J’ai un fichier d’id qui sont 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 ça ne fonctionne pas. Qu’est-ce que je rate?

Utilisez tr place:

 tr , '\n' < file 

Utilisez $'ssortingng'

Vous avez besoin d’une nouvelle ligne littérale avec barre oblique inverse pour accéder à sed. Dans bash au moins, $'' chaînes $'' remplaceront \n par une nouvelle ligne, mais vous devrez doubler la barre oblique inverse que sed verra pour échapper à la nouvelle ligne, par exemple

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

fonctionne sur Mac OS X.

Si votre utilisation de sed a tendance à être entièrement des expressions de substitution (comme la mienne a tendance à l’être), vous pouvez également utiliser perl -pe

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

Cela fonctionne sur MacOS Mountain Lion (10.8), Solaris 10 (SunOS 5.10) et RHE Linux (version du serveur Red Hat Enterprise Linux 5.3, Tikanga) …

 $ sed 's/{pattern}/\^J/g' foo.txt > foo2.txt 

… où ^J se fait en faisant ctrl + v + j . Faites attention au \ avant le ^J

PS, je sais que le sed dans RHEL est GNU, le sed de MacOS est basé sur FreeBSD, et bien que je ne sois pas certain du Solaris sed, je pense que cela fonctionnera plutôt bien avec n’importe quel sed. YMMV tho ‘…

Apparemment, c’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 

Pour ça:

 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 

Pour le compléter, cela fonctionne aussi:

 echo "a,b" | sed "s/,/\\$(echo -e '\n\r')/" 

Bien que je sois en retard à ce poste, je ne fais que mettre à jour mes découvertes. Cette réponse est uniquement pour Mac OS X.

 $ sed 's/new/ > /g' m1.json > m2.json sed: 1: "s/new/ /g": unescaped newline inside substitute pattern 

Dans la commande ci-dessus, j’ai essayé avec Maj + Entrée pour append une nouvelle ligne qui ne fonctionnait pas. Donc, cette fois, j’ai essayé avec “échapper” à la “nouvelle ligne non échappée” comme indiqué par l’erreur.

 $ sed 's/new/\ > /g' m1.json > m2.json 

Travaillé! (sous Mac OS X 10.9.3)

MacOS est différent, il y a deux façons de résoudre ce problème avec sed dans mac

  • D’abord, utilisez \'$'\n'' replace \n , cela peut fonctionner dans MacOS:

     sed 's/,/\'$'\n''/g' file 
  • la seconde, utilisez simplement une ligne vide:

     sed 's/,/\ /g' file 

Simplement pour clarifier: man-page de sed sur OSX (10.8; Darwin Kernel Version 12.4.0) dit:

[…]

Sed Expressions régulières

  The regular expressions used in sed, by default, are basic regular expressions (BREs, see re_format(7) for more information), but extended (modern) regular expressions can be used instead if the -E flag is given. In addition, sed has the following two additions to regular expressions: 1. In a context address, any character other than a backslash (``\'') or newline character may be used to delimit the regular expression. Also, putting a backslash character before the delimiting character causes the character to be treated literally. For example, in the context address \xabc\xdefx, the RE delimiter is an ``x'' and the second ``x'' stands for itself, so that the regular expression is ``abcxdef''. 2. The escape sequence \n matches a newline character embedded in the pattern space. You cannot, however, use a literal newline charac- ter in an address or in the substitute command. 

[…]

donc je suppose que l’on doit utiliser tr – comme mentionné ci-dessus – ou la chouette

 sed "s/,/^M /g" 

note: vous devez taper < ctrl> -v, < return> pour obtenir ‘^ M’ dans l’éditeur vi

nous pouvons le faire aussi dans sed.

vous pouvez essayer ceci,

 sed -i~bak 's/\,/\n/g' file 

-i – changera la modification dans le fichier. Veillez à utiliser cette option.

J’espère que cela vous aidera.

FWIW, la ligne suivante fonctionne dans Windows et remplace les points-virgules dans mes variables de chemin par une nouvelle ligne. J’utilise les outils installés sous mon répertoire git bin.

 echo %path% | sed -e $'s/;/\\n/g' | less