Si tengo una cadena con caracteres no imprimibles, nuevas líneas o pestañas, ¿hay alguna forma que pueda usar echo
para imprimir esta cadena y mostrar códigos para estos caracteres (por ejemplo, \n
para una nueva línea, \b
para retroceder)?
13
e- ohce
* rimshot *printf '%q' "$str"
imprimirá la cadena escapó. No estoy agregando esto como respuesta, ya que no es la misma forma de escape que seecho -e
usa, sino que está destinado a ser evaluado con seguridad, pero (1) es lo suficientemente bueno si su objetivo es la legibilidad humana, (2) es lo suficientemente bueno si su objetivo es la generación segura de shell, y (3)echo -e
es Malo e Incorrecto de todos modos (si lee la especificación POSIX, verá que printf es la forma preferida de formatear cadenas yecho -e
no está garantizado por POSIX de línea de base en todos).Respuestas:
Hay muchas maneras de hacer esto. Los dos más portátiles que conozco son
sed
yod
- ambos son POSIX.Le gusta ...
read
escapes de estilo - C-style.SALIDA
od
es un poco más configurable ...Si quieres saber en qué opciones puedes mirar
man od
, pero especifico que quiero dos tipos de escapes: los-t c
escapes de barra invertida y los-t a
caracteres nombrados. La-w
opción utilizada anteriormente no está especificada en POSIX.Y aquí hay una pequeña función de shell que imprimirá de forma portátil los valores octales de cada byte en sus argumentos, que, por supuesto, también
od
podrían manejarse con-t o
:Esa es una simple. Esto es un poco más complicado. Sin
printf -q
embargo, debería poder hacer lo que pueden hacer las implementaciones específicas de shell .Usando una cadena de ejemplo anterior con un poco adicional:
SALIDA
Es solo un poco diferente. Puede notar que hay
0
una\b
barra extra y una barra extra . Esto es para permitir una fácil traducción aread
un%b
printf
argumento. Por ejemplo:SALIDA
fuente
proctal
?bsq()
respecto? ¿Le falta algo? Pregunto porque no estoy completamente seguro de las barras invertidas.Cuando quite el
-e
interruptor aecho
, inbash
, y siempre que laxpg_echo
opción no se haya habilitado, debería imprimir las cadenas como nada más que su texto original. Entonces,\n
y\t
aparecería literalmente como eso.Ejemplo
También puede usar el
printf
comando incorporado deksh93
,zsh
obash
para finalizar esto también.(La
extracto debash
salida se muestra arriba. Hay algunas variaciones dependiendo del shell).help printf
enbash
fuente
printf %q
que esté truncando los\n
s finales , es la$()
captura de salida que los elimina.printf
dentro de una subshell para capturar su salida es una tontería, yaprintf -v varname
que colocará la salida directamente en una variable, no implicará ninguna subshell.printf
en una subshell, estaba corriendoecho
en una, solo para demostrar que puedes tomar la salida de caracteres especialesecho
y convertirla nuevamente a la notación escapada.Podrías usar algo como,
Ahora, podrías hacer algo como,
Salida
Otra prueba general sin ningún archivo es como,
El comando anterior produce el resultado como,
Referencias
fuente
Con
zsh
, hay el(q)
,(qq)
,(qqq)
,(qqqq)
banderas expansión de variables que se pueden citar las variables de varias maneras:En tu caso, probablemente quieras uno de los dos últimos.
fuente
od -c
imprimirá caracteres normales normalmente, pero caracteres especiales (tabulación, nueva línea, etc.) y caracteres no imprimibles como suprintf
código de escape.Entonces:
El
-An
le diceod
que no muestre la dirección.fuente
Usa el
printf
comando. Por ejemplo:printf "Hello\nthis is my line
saldrá
fuente
echo -e
, estoy buscando lo contrario .