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?
12 réponses
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'
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
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"...
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
Pour le rendre complet, cela fonctionne aussi:
echo "a,b" | sed "s/,/\\$(echo -e '\n\r')/"
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
'
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)
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
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
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.