macos unix sed

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.