GNU/Linux >> Tutoriales Linux >  >> Linux

Convertir cadena a hexadecimal en la línea de comando

Si quieres hacer esto y eliminar los espacios que necesitas:

echo -n "Hello" | od -A n -t x1 | sed 's/ *//g'

Los dos primeros comandos en proceso están bien explicados por @TMS en su respuesta, editada por @James. El último comando difiere del comentario de @TMS en que es correcto y ha sido probado. La explicación es:

  • sed es un s tren ed itor.
  • s es el s sustituir comando.
  • / abre una expresión regular; se puede utilizar cualquier carácter. / es convencional, pero inconveniente para procesar, por ejemplo, XML o nombres de rutas.
  • / o el carácter alternativo que eligió, cierra la expresión regular y abre la cadena de sustitución.
  • En / */ el * coincide con cualquier secuencia del carácter anterior (en este caso, un espacio).
  • / o el carácter alternativo que eligió, cierra la cadena de sustitución. En este caso, la cadena de sustitución // está vacío, es decir, la coincidencia se elimina.
  • g es la opción para hacer esta sustitución g loballly en cada línea en lugar de solo una vez para cada línea.
  • Las comillas evitan que el analizador de comandos se confunda:la secuencia completa se pasa a sed como primera opción, a saber, un sed guión.

Niño intelectual de @TMS (sed 's/^ *//' ) solo elimina los espacios desde el principio de cada línea (^ coincide con el comienzo de la línea:'espacio de patrón' en sed -hablar).

Si además desea eliminar nuevas líneas, la forma más fácil es agregar

| tr -d '\n'

a los conductos de mando. Funciona de la siguiente manera:

  • | alimenta el flujo previamente procesado a la entrada estándar de este comando.
  • tr es el tr comando de traducción.
  • -d especifica la eliminación de los caracteres coincidentes.
  • Las comillas enumeran los caracteres coincidentes; en este caso, solo salto de línea (\n ).Translate solo coincide con caracteres individuales, no con secuencias.

sed es excepcionalmente retrasado cuando se trata de nuevas líneas. Esto se debe a que sed es uno de los unix más antiguos comandos:se creó antes de que las personas supieran realmente lo que estaban haciendo. El software heredado omnipresente evita que se arregle. Lo sé porque nací antes del unix nació.

El origen histórico del problema fue la idea de que una nueva línea era un separador de línea, no parte de la línea. Por lo tanto, fue eliminado por las utilidades de procesamiento de línea y reinsertado por las utilidades de salida. El problema es que esto hace suposiciones sobre la estructura de los datos del usuario e impone restricciones poco naturales en muchos entornos. sed La incapacidad de eliminar fácilmente las líneas nuevas es uno de los ejemplos más comunes de esa ideología malformada que causa dolor.

Es posible eliminar líneas nuevas con sed - es solo que todas las soluciones que conozco hacen sed procesar todo el archivo a la vez, lo que se ahoga con archivos muy grandes, anulando el propósito de un editor de secuencias. Cualquier solución que retenga el procesamiento de línea, si es posible, sería un nido de ratas ilegible de múltiples tuberías.

Si insiste en usar sed prueba:

sed -z 's/\n//g'

-z le dice a sed para usar valores nulos como separadores de línea.

Internamente, una cadena en C se termina con un nulo. El -z La opción también es el resultado del legado, proporcionado como una conveniencia para C programadores a los que les gustaría usar un archivo temporal lleno de C -cadenas y ordenado por saltos de línea. Luego pueden leer y procesar fácilmente una cadena a la vez. Una vez más, las primeras suposiciones sobre los casos de uso imponen restricciones artificiales a los datos de los usuarios.

Si omite el g opción, este comando elimina solo la primera línea nueva. Con el -z opción sed interpreta el archivo completo como una sola línea (a menos que haya valores nulos incrustados en el archivo), terminado por un valor nulo y, por lo tanto, esto también obstruye archivos grandes.

Podrías pensar

sed 's/^/\x00/' | sed -z 's/\n//' | sed 's/\x00//'

Podría funcionar. El primer comando pone un valor nulo al principio de cada línea línea por línea, lo que da como resultado \n\x00 terminando cada línea. El segundo comando elimina una nueva línea de cada línea, ahora delimitada por nulos; solo habrá una nueva línea en virtud del primer comando. Todo lo que queda son los nulos espurios. Hasta aquí todo bien. La idea rota aquí es que la tubería alimentará el último comando línea por línea, ya que así es como se construyó la transmisión. En realidad, el último comando, tal como está escrito, solo eliminará un nulo ya que ahora el archivo completo no tiene líneas nuevas y, por lo tanto, es una sola línea.

La implementación de tubería simple utiliza un archivo temporal intermedio y todas las entradas se procesan y alimentan al archivo. El siguiente comando puede estar ejecutándose en otro subproceso, leyendo simultáneamente ese archivo, pero solo ve el flujo como un todo (aunque incompleto) y no tiene conocimiento de los límites de los fragmentos que alimentan el archivo. Incluso si la tubería es un búfer de memoria, el siguiente comando ve el flujo como un todo. El defecto está inextricablemente integrado en sed .

Para que este enfoque funcione, necesita un g opción en el último comando, así que de nuevo, se atraganta con archivos grandes.

La conclusión es esta:no use sed para procesar líneas nuevas.


echo hello | hexdump -v -e '/1 "%02X "'


echo -n "Hello" | od -A n -t x1

Explicación:

  • El echo programa proporcionará la cadena para el siguiente comando.
  • El -n flag le dice a echo que no genere una nueva línea al final de "Hola".
  • El od programa es el programa de "volcado octal". (Proporcionaremos un indicador para indicarle que lo descargue en hexadecimal en lugar de octal).
  • El -A n bandera es la abreviatura de --address-radix=n , siendo n la abreviatura de "ninguno". Sin esta parte, el comando generaría un prefijo de dirección numérica desagradable en el lado izquierdo. Esto es útil para volcados grandes, pero para una cadena corta no es necesario.
  • El -t x1 bandera es la abreviatura de --format=x1 , donde la x es la abreviatura de "hexadecimal" y el 1 significa 1 byte.

Linux
  1. Manipulación de texto en la línea de comando con sed

  2. ¿Eliminar línea que contiene cierta cadena y la siguiente línea?

  3. Cómo reemplazar una cadena en varios archivos en la línea de comando de Linux

  4. ¿Cómo fusionar imágenes en la línea de comando?

  5. Clonezilla desde la línea de comandos

Convierta documentos a PDF en la línea de comandos de Debian

Convierta nombres de archivo a minúsculas a través de la línea de comandos de Ubuntu

Cómo quitar líneas de un archivo usando el comando Sed

Cómo convertir PDF a imagen en la línea de comandos de Linux

Guía Completa de Comandos Sed [Explicada con Ejemplos Prácticos]

Uso del comando sed de Linux con ejemplos