Tengo un archivo de identificación que está separado por comas. Estoy tratando de reemplazar las comas con una nueva línea. He intentado:
sed 's/,/\n/g' file
Pero no está funcionando. ¿Qué me estoy perdiendo?
Use en su tr
lugar:
tr , '\n' < file
tr ',' ';' < input.csv > output.csv
Use una cadena citada ANSI-C $'string'
Necesita una nueva línea literal con barra invertida para llegar a sed. Al menos en bash, las $''
cadenas se reemplazarán \n
con una nueva línea real, pero luego debe duplicar la barra invertida que verá para escapar de la nueva línea, por ejemplo
echo "a,b" | sed -e $'s/,/\\\n/g'
Tenga en cuenta que esto no funcionará en todos los shells , pero funcionará en los más comunes.
echo "a,b" | sed -e $'s/,/\\n/g
.
man bash
.
sed -E $'s/<\\/br>/\\\n/g' file
no es necesario instalar gnu-sed
-e
parte parece no necesaria.
sed 's/,/\
/g'
funciona en Mac OS X.
Si su uso sed tiende a ser totalmente expresiones de sustitución (como la mía tiende a ser), también se puede utilizar perl -pe
en su lugar
$ echo 'foo,bar,baz' | perl -pe 's/,/,\n/g'
foo,
bar,
baz
Al parecer \r
es la clave!
$ sed 's/, /\r/g' file3.txt > file4.txt
Transformado esto:
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
A esto:
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
\r
no es lo mismo \n
y que esto podría interrumpir la manipulación y el uso de datos.
\r
!
Esto funciona en MacOS Mountain Lion (10.8), Solaris 10 (SunOS 5.10) y RHE Linux (Red Hat Enterprise Linux Server versión 5.3, Tikanga) ...
$ sed 's/{pattern}/\^J/g' foo.txt > foo2.txt
... donde ^J
se hace haciendo ctrl+ v+ j. Te importa el \
antes del ^J
.
PD: Sé que el sed en RHEL es GNU, el MacOS sed está basado en FreeBSD, y aunque no estoy seguro acerca del Solaris sed, creo que esto funcionará más o menos con cualquier sed. YMMV aunque ...
MacOS es diferente, hay dos formas de resolver este problema con sed en mac
primero, use \'$'\n''
replace \n
, puede funcionar en MacOS:
sed 's/,/\'$'\n''/g' file
el segundo, solo usa una línea vacía:
sed 's/,/\
/g' file
PD. Presta atención al rango separado por '
el tercero, usa gnu-sed reemplaza el mac-sed
Para completarlo, esto también funciona:
echo "a,b" | sed "s/,/\\$(echo -e '\n\r')/"
tr
solución, que ya es la respuesta aceptada.
\n\r
lugar de \r\n
? Intenté \r\n
cuál es el orden necesario en Windows. Sin embargo, después de hacer esto, deja muchos ^M
caracteres de retorno de carro vim
, así que creo que se supone que es solo \n
pero \n
solo no funciona.
Aunque llego tarde a esta publicación, solo estoy actualizando mis hallazgos. Esta respuesta es solo para Mac OS X.
$ sed 's/new/
> /g' m1.json > m2.json
sed: 1: "s/new/
/g": unescaped newline inside substitute pattern
En el comando anterior intenté con Shift + Enter para agregar una nueva línea que no funcionó. Así que esta vez traté de "escapar" de la "nueva línea sin escape" como lo indica el error.
$ sed 's/new/\
> /g' m1.json > m2.json
¡Trabajó! (en Mac OS X 10.9.3)
Solo para aclarar: la página de manual de sed en OSX (10.8; Darwin Kernel Versión 12.4.0) dice:
[...]
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.
[...]
así que supongo que uno tiene que usar tr, como se mencionó anteriormente, o el ingenioso
sed "s/,/^M
/g"
nota: debe escribir < ctrl> -v, < return> para obtener '^ M' en el editor vi
$ echo $PATH | sed -e $'s/:/\\\n/g'
/usr/local/sbin
/Library/Oracle/instantclient_11_2/sdk
/usr/local/bin
...
Funciona para mí en Mojave
sed
en macOS Mojave se lanzó en 2005, por lo que una solución es instalar el gnu-sed
,
brew install gnu-sed
entonces el uso gsed
hará lo que desee,
gsed 's/,/\n/g' file
Si lo prefiere sed
, solo sudo sh -c 'echo /usr/local/opt/gnu-sed/libexec/gnubin > /etc/paths.d/brew'
, lo que sugiere brew info gnu-sed
. Reinicie su término, entonces su sed
línea de comando es gsed
.
FWIW, la siguiente línea funciona en Windows y reemplaza los puntos y comas en mis variables de ruta con una nueva línea. Estoy usando las herramientas instaladas en mi directorio git bin.
echo %path% | sed -e $'s/;/\\n/g' | less
tr , '\n'
. Supongo que sed trata\n
como texto plano.tr , '\n' < file
- Sin pipa.g
final del guión? Tengo el mismo comportamiento sin él.