hacer eco de un file como una sola línea con \ n's

Tengo un file de text de varias líneas del que quiero hacer eco como un file de una sola línea donde las nuevas líneas se muestran como \ n.

Cualquier punto sería genial.

Usando el mazo Perl:

 $ perl -pe 's/\n/\\n/' < file.txt ; echo 

El echo está allí para imprimir una nueva línea final en caso de que se desee para fines de visualización. Esto también cambia la NL en la última línea a \n .

O una solución bastante sencilla en Bash, suponiendo que el file no contiene ningún byte NUL embedded. Aunque tenga en count que esto carga todo el file en la memory:

 $ IFS= read -r -d '' text < file.txt; printf '%s\n' "${text//$'\n'/\\n}" 

Tenga cuidado con algunos casos especiales que quizás deba considerar aquí. Tomemos como ejemplo 4 files:

  • file1 un file vacío
  • file2 un file con un solo carácter de nueva línea (␤) (una línea vacía)
  • file3 un file de text adecuado como:

     foo␤ bar␤ 
  • file4 un file con la última línea no delimitada:

     foo␤ bar 

Si tu quieres:

  • file1 : vacío
  • file2 : \n␤
  • file3 : foo\nbar\n␤
  • file4 : foo\nbar␤

(por ejemplo, para que pueda rebuild el file pasando el resultado a printf %b ).

Entonces, podrías hacer:

 perl -pe 's/\n/\\n/; END{print "\n" if $.}' < file 

O con GNU awk :

 gawk '{printf "%s", $0 (RT ? "\\n" : "")} END{if (NR) print ""}' < file 

Puedes adaptarlo si quieres ignorar el delimitador de la última línea, si es que hay alguno, o si no quieres la nueva línea posterior, pero luego puedes probar en esos 4 casos diferentes que hace lo que quieres ya que probablemente encontrarás que debe tener tratamientos especiales para algunos de ellos.

Por ejemplo, tu

 < file sed '$!G' | paste -sd '\\n' - 

la solución para ignorar el delimitador de la última línea produce una línea vacía para el file1 y el file2 (y para el text no delimitado correctamente ( file4 ) puede no funcionar correctamente con todas las implementaciones de sed / paste ya que están destinadas a tratar con text válido) .

 perl -pe 's/\n?$/eof ? "\n" : "\\n"/e' < file 

puede ser más portátil, y tal vez un poco mejor para file1 y file2 , que dejaría intacta.

tr solo no puede hacerlo ya que necesita replace un caracter por dos caracteres. sed solo no puede hacerlo fácilmente ya que genera una nueva línea al final de todo lo que imprime. Pero puede hacerlo combinando los dos: agregue \n al final de cada línea, luego elimine los saltos de línea.

 sed 's/$/\\n/' | tr -d '\n' 

Esto produce un file que termina con \n y sin salto de línea. Si quieres una nueva línea al final, repítelo:

 { sed 's/$/\\n/' | tr -d '\n'; echo; } 

(Tenga en count que esto convierte un file vacío en un file con una sola línea vacía.) Si no desea el último \n , recójalo:

 sed 's/$/\\n/' | tr -d '\n' | sed 's/\\n$//' 

La solución que utilicé fue

 < file.txt sed '$!G' | paste -sd '\\n' - 
  • sed '$!G' agrega una línea vacía a cada línea de input excepto la última ( $ ).
  • paste -sd '\\n' pega esas líneas resultantes alternativamente con barra invertida y n . Y agrega una nueva línea al final para dar como resultado una salida de text válida.