Remplacer la virgule par un retour à la ligne dans sed

J'ai un fichier d'id 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 marche pas. Ce qui me manque?

201
demandé sur WildBill 2012-05-25 08:25:01

12 réponses

Utilisez tr à la place:

tr , '\n' < file
267
répondu Prince John Wesley 2012-05-25 16:27:21

Utiliser $'string'

Vous avez besoin d'une barre oblique inversée pour accéder à sed. Dans bash au moins, $'' les chaînes remplaceront \n par un vrai retour à la ligne, mais vous devez alors doubler la barre oblique inverse que sed verra pour échapper au retour à la ligne, par exemple

echo "a,b" | sed -e $'s/,/\\\n/g'
229
répondu Walter Mundt 2015-08-16 20:14:55
sed 's/,/\
/g'

Fonctionne sur Mac OS X.

102
répondu Max Nanasy 2012-09-07 20:24:55

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 à la place

$ echo 'foo,bar,baz' | perl -pe 's/,/,\n/g'
foo,
bar,
baz
18
répondu nar8789 2014-04-15 23:23:40

Cela fonctionne sur MacOS Mountain Lion (10.8), Solaris 10 (SunOS 5.10) et RHE Linux (Red Hat Enterprise Linux Server release 5.3, Tikanga)...

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

... lorsque le ^J est fait à partir d' ctrl+v+j. Faites attention au \ avant le ^J.

PS, je sais que le sed dans RHEL est GNU, le sed MacOS est basé sur FreeBSD, et bien que je ne sois pas sûr du sed Solaris, je crois que cela fonctionnera à peu près avec n'importe quel sed. YMMV tho"...

11
répondu Ramon Rey 2014-10-11 13:21:08

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

À 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
10
répondu Chris Seymour 2013-08-10 17:55:16

Pour le rendre complet, cela fonctionne aussi:

echo "a,b" | sed "s/,/\\$(echo -e '\n\r')/"
5
répondu ryenus 2013-07-17 11:35:28

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

  • Tout d'Abord ,utilisez \'$'\n'' remplacer \n, il peut travailler dans MacOS:

    sed 's/,/\'$'\n''/g' file
    
  • La seconde, il suffit d'utiliser une ligne vide:

    sed 's/,/\
    /g' file
    
  • Ps. Faites attention à la gamme séparée par '

5
répondu Cnetwork 2018-09-25 02:33:42

Bien que je sois en retard à ce post, je viens de mettre à jour mes résultats. 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 Shift+Entrée pour ajouter une nouvelle ligne qui n'a pas fonctionné. 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)

4
répondu user2300875 2014-10-11 04:31:20

Juste pour clearify: 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 qu'il faut utiliser tr - comme mentionné ci - dessus-ou le astucieux

sed "s/,/^M
/g"

Remarque: vous devez taper ctrl>-v,return> pour obtenir '^M' dans l'éditeur vi

2
répondu t3az0r 2013-08-20 08:12:43

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

echo %path% | sed -e $'s/;/\\n/g' | less
0
répondu jlafay 2014-10-30 15:36:32

Nous pouvons le faire dans sed aussi.

Vous pouvez essayer ceci,

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

- i-va changer la modification dans le file.Be attention à utiliser cette option.

J'espère que cela vous aide.

0
répondu sat 2015-08-09 18:31:18