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?
Utilisez tr
à la place:
tr , '\n' < file
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'
sed 's/,/\
/g'
fonctionne sur Mac OS X.
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
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 '...
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
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 '
Pour le rendre complet, cela fonctionne aussi:
echo "a,b" | sed "s/,/\\$(echo -e '\n\r')/"
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)
Juste pour clarifier: la page de manuel de sed sur OSX (10.8; Darwin Kernel Version 12.4.0) dit:
[...]
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
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
.
$ 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