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, unsed
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.