web-dev-qa-db-fra.com

Remplacer la virgule par newline dans sed sur 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 ça ne fonctionne pas. Qu'est-ce que je rate?

256
WildBill

Utilisez tr à la place:

tr , '\n' < file
318

Utilisez $'string'

Vous avez besoin d'une nouvelle ligne littérale échappée par une barre oblique inverse pour arriver à sed. En bash au moins, les chaînes $'' remplaceront \n par une nouvelle ligne, mais vous devrez alors doubler la barre oblique inverse que sed verra pour échapper à la nouvelle ligne, par exemple.

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

fonctionne sur Mac OS X.

115
Max Nanasy

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

$ echo 'foo,bar,baz' | Perl -pe 's/,/,\n/g'
foo,
bar,
baz
22
nar8789

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

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

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

PS, je sais que RHEL s'appelle GNU, MacOS sed est basé sur FreeBSD et, même si je ne suis pas sûr du Solaris sed, je pense que cela fonctionnera à peu près avec n'importe quel sed. YMMV tho '...

14
Ramon Rey

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

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
13
user2616677

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 sous MacOS:

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

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

7
Cnetwork

Pour le rendre complet, cela fonctionne aussi:

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

Bien que je sois en retard à cet article, je ne fais que mettre à jour mes conclusions. 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 d'ajouter une nouvelle ligne qui ne fonctionnait pas. Donc, cette fois, j’ai essayé d’échapper à la "nouvelle ligne non échappée" comme le dit l’erreur.

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

travaillé! (Sous Mac OS X 10.9.3)

4
user2300875

Juste pour clarifier: la page de manuel 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 le chouette

sed "s/,/^M
/g"

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

2
t3az0r

sed sur macOS Mojave a été publié en 2005, une solution consiste donc à installer le gnu-sed,

brew install gnu-sed

puis utilisez gsed fera ce que vous voulez,

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

Si vous préférez sed, il suffit de Sudo sh -c 'echo /usr/local/opt/gnu-sed/libexec/gnubin > /etc/paths.d/brew', suggéré par brew info gnu-sed. Redémarrez votre terme, alors votre sed en ligne de commande est gsed.

0
DawnSong
$ echo $PATH | sed -e $'s/:/\\\n/g' 
/usr/local/sbin
/Library/Oracle/instantclient_11_2/sdk
/usr/local/bin

...

Fonctionne pour moi sur Mojave

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

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