Si tengo una cadena con caracteres no imprimibles, nuevas líneas o pestañas, ¿hay alguna forma que pueda usar echopara imprimir esta cadena y mostrar códigos para estos caracteres (por ejemplo, \npara una nueva línea, \bpara 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 -eusa, 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 -ees Malo e Incorrecto de todos modos (si lee la especificación POSIX, verá que printf es la forma preferida de formatear cadenas yecho -eno 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
sedyod- ambos son POSIX.Le gusta ...
readescapes de estilo - C-style.SALIDA
odes 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 cescapes de barra invertida y los-t acaracteres nombrados. La-wopció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
odpodrían manejarse con-t o:Esa es una simple. Esto es un poco más complicado. Sin
printf -qembargo, 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
0una\bbarra extra y una barra extra . Esto es para permitir una fácil traducción areadun%bprintfargumento. Por ejemplo:SALIDA
fuente
proctal?bsq()respecto? ¿Le falta algo? Pregunto porque no estoy completamente seguro de las barras invertidas.Cuando quite el
-einterruptor aecho, inbash, y siempre que laxpg_echoopción no se haya habilitado, debería imprimir las cadenas como nada más que su texto original. Entonces,\ny\taparecería literalmente como eso.Ejemplo
También puede usar el
printfcomando incorporado deksh93,zshobashpara finalizar esto también.(La
extracto debashsalida se muestra arriba. Hay algunas variaciones dependiendo del shell).help printfenbashfuente
printf %qque esté truncando los\ns finales , es la$()captura de salida que los elimina.printfdentro de una subshell para capturar su salida es una tontería, yaprintf -v varnameque colocará la salida directamente en una variable, no implicará ninguna subshell.printfen una subshell, estaba corriendoechoen una, solo para demostrar que puedes tomar la salida de caracteres especialesechoy 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 -cimprimirá caracteres normales normalmente, pero caracteres especiales (tabulación, nueva línea, etc.) y caracteres no imprimibles como suprintfcódigo de escape.Entonces:
El
-Anle diceodque no muestre la dirección.fuente
Usa el
printfcomando. Por ejemplo:printf "Hello\nthis is my linesaldrá
fuente
echo -e, estoy buscando lo contrario .