¿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 tr
esto, 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 grep
elimina nuevas líneas. ¿Sed hace lo mismo?
tr
agregaría un final,
y generaría una línea sin terminar. Lo mejor es usarpaste
en su lugar:paste -sd , test.txt
Respuestas:
Con GNU
sed
y proporcionadoPOSIXLY_CORRECT
no 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 :
:a
N
$!ba
($!
significa no hacerlo en la última línea (ya que debería haber una nueva línea final)).fuente
ba: Event not found
sed
comando anterior con esas opciones exactas? En quetest.txt
archivo? ¿Con qué versión desed
(probarsed --version
)?!
. Curiosamente, eso todavía no funcionó para mí y terminé teniendo que escapar dos veces!
en mi.csh
guió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
:-z
está incluido desde 4.2.2NÓTESE BIEN.
-z
cambia 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
sed
sintaxis 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.sed
siempre elimina el\n
ewline final justo antes de llenar el espacio del patrón, y luego agrega uno antes de escribir los resultados de su script. Se\n
puede 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\n
ewlines ensed
el espacio del patrón siempre reflejan un cambio y nunca ocurren en la secuencia de entrada.\n
Las líneas electrónicas son el único delimitador con el que unsed
der puede contar con una entrada desconocida.Si desea reemplazar todas las
\n
líneas electrónicas con comas y su archivo no es muy grande, puede hacer lo siguiente:Eso agrega cada línea de entrada al
h
espacio anterior, excepto la primera, que en su lugar sobrescribe elh
espacio anterior, siguiendo un\n
carácter de línea de flujo. Luegod
elige cada línea, no la$!
última de la salida. En la última líneaH
, los espacios antiguos y de patrón sex
cambian y todos los\n
caracteres de línea electrónica sey///
traducen a comas.Para archivos grandes, este tipo de cosas pueden causar problemas:
sed
el 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
s
comando 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
-r
solo está disponible en GNUsed
, no en BSD.