¿Hay algún problema con sed y el nuevo carácter de línea?
Tengo un archivo test.txt con los siguientes contenidos
aaaaa
bbbbb
ccccc
ddddd
Lo siguiente no funciona:
sed -r -i 's/\n/,/g' test.txt
Sé que puedo usar tresto, pero mi pregunta es por qué no parece posible con sed.
Si este es un efecto secundario del procesamiento del archivo línea por línea, me interesaría saber por qué sucede esto. Creo que grepelimina nuevas líneas. ¿Sed hace lo mismo?

tragregaría un final,y generaría una línea sin terminar. Lo mejor es usarpasteen su lugar:paste -sd , test.txtRespuestas:
Con GNU
sedy proporcionadoPOSIXLY_CORRECTno está en el entorno (para entrada de una sola línea):Desde https://stackoverflow.com/questions/1251999/sed-how-can-i-replace-a-newline-n :
:aN$!ba($!significa no hacerlo en la última línea (ya que debería haber una nueva línea final)).fuente
ba: Event not foundsedcomando anterior con esas opciones exactas? En quetest.txtarchivo? ¿Con qué versión desed(probarsed --version)?!. Curiosamente, eso todavía no funcionó para mí y terminé teniendo que escapar dos veces!en mi.cshguión. Así que realmente no tengo un problema en este momento, pero ¿sabes por qué podría ser? Lo que funcionó para mí fuesed :a;N;$\\!ba;s/\n/ /g'Esto funciona con GNU
sed:-zestá incluido desde 4.2.2NÓTESE BIEN.
-zcambia el delimitador a caracteres nulos (\0). Si su entrada no contiene caracteres nulos, toda la entrada se trata como una sola línea. Esto puede venir con sus limitaciones .Para evitar que se reemplace la nueva línea de la última línea, puede volver a cambiarla:
(Que es la
sedsintaxis de GNU nuevamente, pero no importa ya que todo es solo GNU)fuente
Desde el sitio web de Oracle:
Básicamente, esto significa que debido a que sed está leyendo línea por línea, el carácter de nueva línea no coincide.
La solución de https://stackoverflow.com/questions/1251999/sed-how-can-i-replace-a-newline-n es:
o, en una versión portátil (sin
;concatenar después de las etiquetas de marca de salto)En esa página se proporciona una explicación de cómo funciona.
fuente
sed, si POSIXLY_CORRECT está en el entorno y la entrada tiene solo una línea, no habrá salida.sedsiempre elimina el\newline final justo antes de llenar el espacio del patrón, y luego agrega uno antes de escribir los resultados de su script. Se\npuede tener un ewline en el espacio de patrones por varios medios, pero nunca si no es el resultado de una edición. Esto es importante: los\newlines ensedel espacio del patrón siempre reflejan un cambio y nunca ocurren en la secuencia de entrada.\nLas líneas electrónicas son el único delimitador con el que unsedder puede contar con una entrada desconocida.Si desea reemplazar todas las
\nlíneas electrónicas con comas y su archivo no es muy grande, puede hacer lo siguiente:Eso agrega cada línea de entrada al
hespacio anterior, excepto la primera, que en su lugar sobrescribe elhespacio anterior, siguiendo un\ncarácter de línea de flujo. Luegodelige cada línea, no la$!última de la salida. En la última líneaH, los espacios antiguos y de patrón sexcambian y todos los\ncaracteres de línea electrónica sey///traducen a comas.Para archivos grandes, este tipo de cosas pueden causar problemas:
sedel búfer en los límites de línea, que puede desbordarse fácilmente con acciones de este tipo.fuente
Alternativamente, puede usar una sintaxis un poco más simple:
... simplemente cambiando el orden de la secuencia.
fuente
scomando para cada línea de entrada en un espacio de patrón que es cada vez más grande.Hay algo de magia sed muy agradable aquí. Y algunos buenos puntos planteados sobre el desbordamiento del espacio del patrón. Me encanta usar sed incluso cuando no es la forma más simple, porque es muy compacto y potente. Sin embargo, tiene sus limitaciones, y para grandes cantidades de datos, el espacio del patrón debería ser mahoosive.
GNU dice esto:
No tengo mucho que agregar, pero me gustaría señalarle hacia mi guía de referencia para sed . Es excelente. http://www.grymoire.com/Unix/Sed.html
y aquí está mi solución:
bien funciona
fuente
Digamos que desea reemplazar las nuevas líneas por
\n. Quería hacer eso, así que esto es lo que hice:Esto es lo que hace: para todas las líneas, excepto la última , agregar
\n. Luego, elimine las nuevas líneas contr.fuente
-rsolo está disponible en GNUsed, no en BSD.