Vous avez besoin d'une nouvelle ligne littérale échappée par une barre oblique inversée pour accéder à sed. En bash au moins, les $''chaînes remplaceront \npar une vraie nouvelle ligne, mais ensuite vous devrez doubler la barre oblique inverse que sed verra pour échapper à la nouvelle ligne, par exemple
Merci pour cela - Je me demandais pourquoi mon vieux truc linux ne fonctionnait pas sous OSX. Mais c'est le cas!
Wyatt8740
6
C'est la seule solution qui fonctionne dans un script sed.
Firstrock
6
Notez que la barre oblique inverse échappe au saut de ligne littéral (de sorte qu'il ne s'agit pas d'un terminateur de commande): ce n'est pas un caractère de continuation de ligne (comme dans bash, etc.). Pour voir la différence, essayez d'écrire la commande ci-dessus sans les guillemets: la barre oblique inverse sera à la place interprétée par le shell comme un caractère de continuation de ligne et la nouvelle ligne sera supprimée. Inversement, incluez le contenu de l'expression citée (sans guillemets) dans un fichier séparé virgule-vers-newline.sed (ce qui élimine la syntaxe du shell), et ça marche!
Nils von Barth
1
c'est bien car il peut remplacer n'importe quoi, pas un personnage. tr semble fonctionner avec uniquement des personnages. si vous mettez une chaîne comme premier paramètre, elle remplacera toute l'occurrence des caractères, pas la chaîne.
Shawn
1
@Droogans Utilisez-vous bash, sh ou un autre shell? Êtes-vous sûr d'utiliser des guillemets simples au lieu de guillemets doubles?
Max Nanasy
22
Si votre utilisation de sed tend à être entièrement des expressions de substitution (comme la mienne a tendance à l'être), vous pouvez également utiliser à la perl -peplace
$ 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 version 5.3, Tikanga) ...
$ sed 's/{pattern}/\^J/g' foo.txt > foo2.txt
... où ^Jcela se fait en faisant ctrl+ v+ j. Faites attention \avant ^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 sûr du sed de Solaris, je crois que cela fonctionnera à peu près avec n'importe quel sed. YMMV tho '...
Ce serait également approprié pour le concours Obfuscated C, sauf que c'est Bash;)
Aaron R.
@AaronR. Je suis d'accord :-). Je préfère sûrement la trsolution, qui est déjà la réponse acceptée.
ryenus
1
Cela a fonctionné sur OS X. Pourquoi est-ce \n\rau lieu de \r\n? J'ai essayé \r\nquel est l'ordre nécessaire sur Windows. Cependant, après avoir fait cela, il laisse beaucoup de ^Mcaractères de retour chariot vim, donc je pense que c'est censé être seulement \nmais \nseul ne fonctionne pas.
NobleUplift
4
Bien que je sois en retard à ce poste, je mets simplement à jour mes résultats. Cette réponse est uniquement pour Mac OS X.
Dans la commande ci-dessus, j'ai essayé avec Shift + Enter d'ajouter une nouvelle ligne qui ne fonctionnait pas. Donc cette fois, j'ai essayé avec "échapper" la "nouvelle ligne sans échappatoire" comme indiqué par l'erreur.
Ce n'est pas différent de la réponse de Max Nanasy deux ans avant la vôtre.
miken32
2
Juste pour clarifier: la page de manuel de sed sur OSX (10.8; Darwin Kernel Version 12.4.0) dit:
[...]
Expressions régulières Sed
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"
note: vous devez taper < ctrl> -v, < return> pour obtenir '^ M' dans l'éditeur vi
sedsur macOS Mojave est sorti en 2005, donc une solution consiste à installer le gnu-sed,
brew install gnu-sed
alors l'utilisation gsedfera ce que vous voudrez,
gsed 's/,/\n/g' file
Si vous préférez sed, juste sudo sh -c 'echo /usr/local/opt/gnu-sed/libexec/gnubin > /etc/paths.d/brew'ce qui est suggéré par brew info gnu-sed. Redémarrez votre terme, puis votre sedligne de commande est gsed.
FWIW, la ligne suivante fonctionne dans les fenêtres 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.
tr , '\n'
. Je suppose que sed traite\n
comme du texte brut.tr , '\n' < file
- pas de pipe.g
fin du script? J'obtiens le même comportement sans lui.Réponses:
Utilisez
tr
plutôt:la source
tr ',' ';' < input.csv > output.csv
Utilisez une chaîne entre guillemets ANSI-C
$'string'
Vous avez besoin d'une nouvelle ligne littérale échappée par une barre oblique inversée pour accéder à sed. En bash au moins, les
$''
chaînes remplaceront\n
par une vraie nouvelle ligne, mais ensuite vous devrez doubler la barre oblique inverse que sed verra pour échapper à la nouvelle ligne, par exempleNotez que cela ne fonctionnera pas sur tous les shells , mais fonctionnera sur les plus courants.
la source
echo "a,b" | sed -e $'s/,/\\n/g
.man bash
.sed -E $'s/<\\/br>/\\\n/g' file
pas besoin d'installer gnu-sed-e
partie ne semble pas nécessaire.fonctionne sur Mac OS X.
la source
Si votre utilisation de sed tend à être entièrement des expressions de substitution (comme la mienne a tendance à l'être), vous pouvez également utiliser à la
perl -pe
placela source
Apparemment,
\r
c'est la clé!Transformé ceci:
Pour ça:
la source
\r
n'est pas la même chose\n
, et cela pourrait interrompre la manipulation et l'utilisation des données.\r
!Cela fonctionne sur MacOS Mountain Lion (10.8), Solaris 10 (SunOS 5.10) et RHE Linux (Red Hat Enterprise Linux Server version 5.3, Tikanga) ...
... où
^J
cela se fait en faisant ctrl+ v+ j. Faites attention\
avant^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 sûr du sed de Solaris, je crois que cela fonctionnera à peu près avec n'importe quel sed. YMMV tho '...
la source
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''
replace\n
, cela peut fonctionner sous MacOS:la seconde, utilisez simplement une ligne vide:
Ps. Faites attention à la plage séparée par
'
le troisième, utilisez gnu-sed pour remplacer le mac-sed
la source
Pour le compléter, cela fonctionne aussi:
la source
tr
solution, qui est déjà la réponse acceptée.\n\r
au lieu de\r\n
? J'ai essayé\r\n
quel est l'ordre nécessaire sur Windows. Cependant, après avoir fait cela, il laisse beaucoup de^M
caractères de retour chariotvim
, donc je pense que c'est censé être seulement\n
mais\n
seul ne fonctionne pas.Bien que je sois en retard à ce poste, je mets simplement à jour mes résultats. Cette réponse est uniquement pour Mac OS X.
Dans la commande ci-dessus, j'ai essayé avec Shift + Enter d'ajouter une nouvelle ligne qui ne fonctionnait pas. Donc cette fois, j'ai essayé avec "échapper" la "nouvelle ligne sans échappatoire" comme indiqué par l'erreur.
Travaillé! (sous Mac OS X 10.9.3)
la source
Juste pour clarifier: la page de manuel de sed sur OSX (10.8; Darwin Kernel Version 12.4.0) dit:
[...]
Expressions régulières Sed
[...]
donc je suppose qu'il faut utiliser tr - comme mentionné ci-dessus - ou le astucieux
note: vous devez taper < ctrl> -v, < return> pour obtenir '^ M' dans l'éditeur vi
la source
...
Fonctionne pour moi sur Mojave
la source
sed
sur macOS Mojave est sorti en 2005, donc une solution consiste à installer legnu-sed
,alors l'utilisation
gsed
fera ce que vous voudrez,Si vous préférez
sed
, justesudo sh -c 'echo /usr/local/opt/gnu-sed/libexec/gnubin > /etc/paths.d/brew'
ce qui est suggéré parbrew info gnu-sed
. Redémarrez votre terme, puis votresed
ligne de commande estgsed
.la source
FWIW, la ligne suivante fonctionne dans les fenêtres 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.
la source