macos - Reemplace la coma con nueva línea en sed
unix (12)
Al parecer 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
Tengo un archivo de identificadores que están separados 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?
Aunque llego tarde a este post, solo estoy actualizando mis conclusiones. 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 intenté con "escapar" de la "nueva línea no escapada" según lo dicho por el error.
$ sed ''s/new//
> /g'' m1.json > m2.json
¡Trabajó! (en Mac OS X 10.9.3)
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 se hace ^J
haciendo ctrl + v + j . No te preocupes de la /
^J
antes de la ^J
PD: Sé que el sed en RHEL es GNU, el MacOS sed está basado en FreeBSD, y aunque no estoy seguro del Solaris sed, creo que esto funcionará prácticamente con cualquier sed. YMMV aunque ...
FWIW, la siguiente línea funciona en windows y reemplaza los puntos y coma en las variables de mi ruta con una nueva línea. Estoy usando las herramientas instaladas en mi directorio de git bin.
echo %path% | sed -e $''s/;///n/g'' | less
MacOS es diferente, hay dos maneras de resolver este problema con sed en mac
primero, use
/'$''/n''''
reemplazar/n
, puede funcionar en MacOS:sed ''s/,//'$''/n''''/g'' file
el segundo, solo usa una línea vacía:
sed ''s/,// /g'' file
PD. Preste atención a la gama separada por
''
Para hacerlo completo, esto también funciona:
echo "a,b" | sed "s/,///$(echo -e ''/n/r'')/"
Podemos hacer esto también en sed.
puedes probar esto
sed -i~bak ''s//,//n/g'' file
-i - cambiará la modificación en el archivo. Tenga cuidado al usar esta opción.
Espero que esto te ayude.
Si su uso de sed tiende a ser totalmente expresiones de sustitución (como el mío tiende a ser), también puede usar perl -pe en su lugar
$ echo ''foo,bar,baz'' | perl -pe ''s/,/,/n/g''
foo,
bar,
baz
Solo para aclarar: la página de manual de sed en OSX (10.8; Darwin Kernel versión 12.4.0) dice:
[...]
Expresiones regulares 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.
[...]
así que supongo que uno tiene que usar tr - como se mencionó anteriormente - o el ingenioso
sed "s/,/^M
/g"
nota: tienes que escribir < ctrl> -v, < return> para obtener ''^ M'' en el editor vi
Use $''string''
Necesitas una línea nueva literal de barra diagonal inversa para llegar a sed. Al menos en bash, $''''
cadenas $''''
reemplazarán a /n
con una nueva línea real, pero luego tienes que doblar la barra invertida que se verá para escapar de la nueva línea, por ejemplo
echo "a,b" | sed -e $''s/,////n/g''
Utilice tr
lugar:
tr , ''/n'' < file
sed ''s/,//
/g''
Funciona en Mac OS X.