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
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
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 ...
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.
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.
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
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.
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.
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.Respuestas:
Use en su
tr
lugar:fuente
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 ejemploTenga en cuenta que esto no funcionará en todos los shells , pero funcionará en los más comunes.
fuente
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.funciona en Mac OS X.
fuente
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 lugarfuente
Al parecer
\r
es la clave!Transformado esto:
A esto:
fuente
\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) ...
... 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 ...
fuente
MacOS es diferente, hay dos formas de resolver este problema con sed en mac
primero, use
\'$'\n''
replace\n
, puede funcionar en MacOS:el segundo, solo usa una línea vacía:
PD. Presta atención al rango separado por
'
el tercero, usa gnu-sed reemplaza el mac-sed
fuente
Para completarlo, esto también funciona:
fuente
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 carrovim
, 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.
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.
¡Trabajó! (en Mac OS X 10.9.3)
fuente
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
[...]
así que supongo que uno tiene que usar tr, como se mencionó anteriormente, o el ingenioso
nota: debe escribir < ctrl> -v, < return> para obtener '^ M' en el editor vi
fuente
...
Funciona para mí en Mojave
fuente
sed
en macOS Mojave se lanzó en 2005, por lo que una solución es instalar elgnu-sed
,entonces el uso
gsed
hará lo que desee,Si lo prefiere
sed
, solosudo sh -c 'echo /usr/local/opt/gnu-sed/libexec/gnubin > /etc/paths.d/brew'
, lo que sugierebrew info gnu-sed
. Reinicie su término, entonces sused
línea de comando esgsed
.fuente
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.
fuente