¿Reemplazar coma con nueva línea en sed en MacOS?

287

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?

WildBill
fuente
12
tratar tr , '\n'. Supongo que sed trata \ncomo texto plano.
Príncipe John Wesley
1
¡Eso funciono! archivo de gato | tr, '\ n'
WildBill
77
tr , '\n' < file- Sin pipa.
Príncipe John Wesley
¿Para qué sirve el gfinal del guión? Tengo el mismo comportamiento sin él.
Hola
¿Qué caparazón estás usando? Esto funciona para mí, usando el shell bash.
Hola

Respuestas:

362

Use en su trlugar:

tr , '\n' < file
Príncipe John Wesley
fuente
Estaba buscando reemplazar '.' período, y esta fue la solución que estoy buscando :)
Jonás
1
No funciona en bash shell $ tr, uso de '\ n' aitr: tr [-Ccsu] string1 string2 tr [-Ccu] -d string1 tr [-Ccu] -s string1 tr [-Ccu] -ds string1 string2
Estudiante
55
Reemplazar una coma con un punto y coma también funciona:tr ',' ';' < input.csv > output.csv
Wim Deblauwe
304

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 \ncon 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.

Walter Mundt
fuente
55
extraño, también funciona con una barra invertida menos, es decir echo "a,b" | sed -e $'s/,/\\n/g.
Alexandre Holden Daly
2
Votado Para obtener más información, consulte la sección "CITA" de man bash.
tboyce12 01 de
77
Lo tengo funcionando con OSX 10.11: sed -E $'s/<\\/br>/\\\n/g' fileno es necesario instalar gnu-sed
Brice
2
Trabajo verificado en OS X 10.7 con el ejemplo dado. La -eparte parece no necesaria.
Yongwei Wu
1
ejemplo en respuesta inmediatamente me funciona en OSX 10.11.5
Jurriaan Roelofs
122
sed 's/,/\
/g'

funciona en Mac OS X.

Max Nanasy
fuente
3
Gracias por esto: me preguntaba por qué mi viejo truco de Linux no funcionaba en OSX. ¡Pero esto sí!
Wyatt8740
66
Esta es la única solución que funciona en un script sed.
Firstrock
66
Tenga en cuenta que la barra invertida se escapa el fin de linea (por lo que no es un terminador de comandos): es no un carácter de continuación de línea (como en la fiesta, etc.). Para ver la diferencia, intente escribir el comando anterior sin las comillas: la barra invertida en su lugar será interpretada por el shell como un carácter de continuación de línea y se descartará la nueva línea. Por el contrario, incluya el contenido de la expresión entre comillas (sin comillas) en un archivo separado de coma a línea nueva.sed (que elimina la sintaxis de shell), ¡y funciona!
Nils von Barth
1
Esto es bueno ya que puede reemplazar cualquier cosa, no un personaje. tr parece funcionar solo con personajes. Si coloca una cadena como primer parámetro, reemplazará todos los caracteres, no la cadena.
Shawn
1
@Droogans ¿Estás usando bash, sh o un shell diferente? ¿Estás seguro de que estás usando comillas simples en lugar de comillas dobles?
Max Nanasy
22

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 -peen su lugar

$ echo 'foo,bar,baz' | perl -pe 's/,/,\n/g'
foo,
bar,
baz
nar8789
fuente
15

Al parecer \res 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
Chris Seymour
fuente
Sé que la pregunta dice OS X, pero esto no funciona con GNU sed-4.2.2-6.fc20.x86_64.
Cristian Ciupitu
10
Tenga en cuenta que \rno es lo mismo \ny que esto podría interrumpir la manipulación y el uso de datos.
Joel Purra
3
Lo siento, esto no funcionó para mí. Acabo de recibir una 'r' donde debería haber una nueva línea.
Frank de Groot - Schouten
¡Deberías dejarlo más claro en la respuesta que esto da \r!
pir
Funcionó para mí, pero me pregunto por qué. \ n es el estándar en unix stackoverflow.com/questions/1761051/difference-between-n-and-r
Alex
15

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 ^Jse 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 ...

Ramon Rey
fuente
12

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

Red
fuente
7

Para completarlo, esto también funciona:

echo "a,b" | sed "s/,/\\$(echo -e '\n\r')/"
ryenus
fuente
1
Esto también sería apropiado para el concurso C ofuscado, excepto que es Bash;)
Aaron R.
@AaronR. Estoy de acuerdo :-). Seguramente prefiero la trsolución, que ya es la respuesta aceptada.
ryenus
1
Esto funcionó en OS X. ¿Por qué es en \n\rlugar de \r\n? Intenté \r\ncuál es el orden necesario en Windows. Sin embargo, después de hacer esto, deja muchos ^Mcaracteres de retorno de carro vim, así que creo que se supone que es solo \npero \nsolo no funciona.
NobleUplift
4

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)

usuario2300875
fuente
Esto no es diferente a la respuesta de Max Nanasy dos años antes que la tuya.
miken32
2

Solo para aclarar: la página de manual de sed en OSX (10.8; Darwin Kernel Versión 12.4.0) dice:

[...]

Expresiones regulares de 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: debe escribir < ctrl> -v, < return> para obtener '^ M' en el editor vi

t3az0r
fuente
2
$ echo $PATH | sed -e $'s/:/\\\n/g' 
/usr/local/sbin
/Library/Oracle/instantclient_11_2/sdk
/usr/local/bin

...

Funciona para mí en Mojave

Paulo Henrique Lellis Gonalves
fuente
1

seden macOS Mojave se lanzó en 2005, por lo que una solución es instalar el gnu-sed,

brew install gnu-sed

entonces el uso gsedhará 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 sedlínea de comando es gsed.

DawnSong
fuente
0

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
Jeff LaFay
fuente