Imprimir variable con barras invertidas en el tablero

Mi caparazón es dash. Mi problema es el siguiente:

# A="abc\nde fg" # printf "$A" abc de fg# # B="abc\\nde fg" # printf "$B" abc de fg# # C="abc\\\nde fg" # printf "$C" abc\nde fg# 

La variable de cadena con la que estoy trabajando tiene espacios y \n y posiblemente otros caracteres de espacio en blanco. Me gustaría acceder a la variable $A sin escaping de \n en la cadena. El uso de comillas simples no lo interpreta como una variable y el uso de comillas dobles interpreta esos caracteres especiales.

¿Dash tiene una forma integrada en el caparazón para hacerlo? Sé que puedo enviar la variable a un progtwig externo que duplicará las barras invertidas para los caracteres de escape en la cadena, pero eso simplemente parece incorrecto.

EDITAR:

Me doy count de mi error con printf pero no está relacionado en este caso. Inicialmente estaba usando echo . Este es un mejor ejemplo de lo que estoy preguntando. Aquí hay dos de las mismas secuencias de command exactas, solo la primera está en bash y la segunda en guión:

bash

 $ cat sample.txt abc\nde fg some string $ A=`cat sample.txt` $ echo "$A" abc\nde fg some string $ 

guión

 $ cat sample.txt abc\nde fg some string $ A=`cat sample.txt` $ echo "$A" abc de fg some string $ 

Me gustaría saber si puedo tener dash no interpretar el \n en esta secuencia de commands. Ya he implementado una solución usando un command externo. El uso adecuado de printf hace lo que quiero, pero tengo curiosidad por ver si el propio tablero tiene alguna manera de hacer esto por sí mismo.

Esta es la razón por la cual surgió la pregunta, para completar. Necesito leer un file y CONDICIONALMENTE comentar o descomentar la parte inferior. La primera parte tiene un literal \n (no nueva línea) que necesita permanecer de esa manera en el file reescrito.

Dividí el file en 2 piezas usando sed encerrado en los palos de atrás y los asigno a las variables. Al final, concateno las variables simplemente haciendo algo como "$VAR1$VAR2" , donde $VAR2 ya ha sido comentado condicionalmente, sin comentarios, o dejado solo.

Su problema es que Bash y Dash tienen echo como un built-in, pero las dos implementaciones no se comportan igual cuando se les da una cadena que contiene \ :

 echo 'abc\ndef' 

Esto produce diferentes resultados en los dos caparazones.


Puede get resultados consistentes utilizando printf '%s\n' ; aunque esto también es un built-in, produce el mismo resultado en ambos shells (esto no es cierto para todas las conversiones, por ejemplo, bash proporciona una conversión %q que no ocurre con dash):

 printf '%s\n' 'abc\ndef' 

Esto produce abc\ndef en ambas conchas.


Alternativamente, podría usar una implementación externa de echo ; en Linux, coreutils le da eco de GNU en /bin/echo :

 /bin/echo 'abc\ndef' 

Tenga en count, sin embargo, que esto es less portátil. El file de información de GNU tiene esto que decir:

POSIX no requiere soporte para ninguna opción, y dice que el comportamiento de echo está definido por la implementación si una cadena contiene una barra diagonal inversa o si el primer argumento es -n . Los progtwigs portátiles pueden usar el command printf si necesitan omitir nuevas líneas finales o caracteres de control de salida o barras diagonales inversas.

No, hay muchas variantes de echo . echo no es un command portátil.

el echo dash es en realidad una de las pocas implementaciones de echo que cumple con UNIX (al less en ese sentido, dash no es consciente de multibyte, hay otras áreas donde no es compatible con sistemas que admiten configuraciones regionales de múltiples bytes, por ejemplo) .

La especificación UNIX requiere

 echo '\n' 

para dar salida a dos caracteres de nueva línea y

 echo -ex 

para producir -e x<newline> .

Mientras que algunos otros shells como AT & T ksh , bash , yash o zsh tienen configuraciones para alterar el comportamiento de su echo incorporado (el comportamiento del command echo GNU también puede verse afectado por el entorno), actualmente no es el caso para dash .

En cualquier caso, no desea usar echo para generar datos arbitrarios. El command estándar y portátil para eso es printf .

Puede encontrar más detalles, incluyendo cómo implementar un echo diferente como function de envoltura alnetworkingedor de printf en la respuesta a ¿Por qué printf es mejor que echo?

Está utilizando printf con su variable como la cadena de formatting en lugar de ser un valor interpolado por la cadena de formatting.

O use echo o use printf la forma en que fue diseñado. Aquí hay unos ejemplos:

 A="abc\nde fg" B="abc\\nde fg" C="abc\\\nde fg" echo "$A" abc\nde fg echo "$B" abc\nde fg echo "$C" abc\\nde fg printf "%s\n" "$A" abc\nde fg printf "Here is variable B: %s\n" "$B" Here is variable B: abc\nde fg printf "> %s <\n" "$C" > abc\\nde fg < 

A propósito, al usar cadenas de comillas dobles, se analizan y se procesa el carácter de barra invertida \ . Si define las variables con cadenas entre comillas, también se puede conservar el set completo de \ caracteres:

 A='abc\nde fg' B='abc\\nde fg' C='abc\\\nde fg' echo "$A" abc\nde fg echo "$B" abc\\nde fg echo "$C" abc\\\nde fg