En resumen, printf %100s
imprimirá 100 espacios y tr " " "="
los convertirá en signos iguales, imprimiendo efectivamente 100 signos iguales.
Desglosándolo:
printf
Es un shell incorporado. Por lo general, se necesitan dos o más argumentos, el primero de los cuales es una "cadena de formato" y el resto se usará para completar los marcadores de posición en esa cadena de formato. Una vez que la plantilla esté completamente llena, imprimirá el resultado. Si quedan más argumentos, comenzará de nuevo, llenando más argumentos e imprimiendo la cadena resultante.
La cadena de formato utilizada para printf
toma especificaciones de formato, que comienzan %
y terminan con una sola letra, por lo que %d
significa un número entero (usando la base decimal, por lo tanto, "d"), %f
significa un número de coma flotante y %s
significa una cadena de caracteres. Los caracteres que no son letras después de ellos %
son modificadores para la especificación de formato y, en particular, los números se utilizan para especificar la longitud solicitada del campo en la salida. Entonces %100s
formateará la cadena para que tenga al menos 100 caracteres, la rellenará con espacios y la mantendrá alineada a la derecha (en otras palabras, agregará espacios al comienzo de la cadena).
Si se pasa un argumento adicional, lo usaría para ese %s
campo, por lo que , por ejemplo printf %100s abc
, imprimirá 97 espacios (para llegar a 100 en total, considerando el 3 en "abc") seguido de la cadena real "abc". Pero si no se proporciona ningún argumento, la especificación de formato se rellena con un argumento vacío o nulo (que es una cadena vacía para %s
, sería 0 para %d
, etc.) Entonces, eso es lo mismo que si se pasara una cadena vacía, como printf %100s ''
. El resultado final es que solo se imprime el relleno de 100 caracteres.
Entonces, al unirlo todo, se printf %100s
imprimen 100 espacios.
Ahora tr
es una herramienta para traducir caracteres de entrada a salida. Toma dos argumentos, SET1 y SET2, cada uno un conjunto de caracteres, y luego traduce el primer carácter de SET1 en el primero de SET2, el segundo carácter de SET1 en el segundo de SET2 y así sucesivamente. tr
lee su entrada de stdin y la vuelve a escribir en stdout (por lo que es muy útil en canalizaciones como la anterior). tr
Siempre traducirá todas las apariciones de ese carácter en una cadena dada.
Por ejemplo, tr aeiou 12345
traducirá las vocales en minúsculas en los números del 1 al 5 en ese orden, por lo que traducirá "hacer cola" en "q52523ng", por ejemplo. También puede pasarle rangos de caracteres, como tr a-z A-Z
convertir cualquier letra minúscula en su correspondiente mayúscula.
Entonces, tr " " "="
simplemente está traduciendo espacios en signos iguales a lo largo de la cadena. El primer espacio necesita ser citado para ser reconocido como un argumento. En =
realidad, no es necesario citarlo, pero hacerlo no hace daño. tr " " =
hubiera funcionado igual.
Poniendo todo junto, imprime 100 espacios, luego traduce cada uno de ellos en signos iguales.
Esperemos que esto lo explique con suficiente detalle, pero si todavía hay algo que no comprende, deje un comentario e intentaré solucionarlo.
printf '%100s' ' ' | tr " " "="
printf '%100s' ''
, con una cadena vacía ... Actualicé la respuesta para incluir eso. En este caso particular, una cadena vacía o un solo espacio no marcarían la diferencia, pero puede ver una diferencia enprintf '%sx\n'
, que es igualprintf '%sx\n' ''
pero diferente deprintf '%sx\n' ' '
. ¡Espero que eso ayude!tr
opera en conjuntos de personajes. Esto a menudo se deja fuera.El
printf
comando utiliza su primer argumento como formato para imprimir sus argumentos posteriores.printf %100s
imprime sus argumentos rellenados a 100 caracteres de ancho, usando espacios (a la izquierda). No se proporciona ningún argumento para formatear, por lo que formatea la cadena vacía una vez y genera 100 espacios. Puedes ver eso:(20 es el hex para un espacio;
*
significa la línea anterior repetida)Las cadenas de formato usan aproximadamente los
Xprintf
especificadores de C :%
un ancho opcional para ajustar el valor formateado y un tipo de formato para usar.s
es el formato de cadena, y las cadenas se rellenan con espacios a la izquierda de forma predeterminada. Podría haber múltiples formatos u otras partes literales:printf "a%10sb\n" hello
impresionestr
reemplaza los caracteres seleccionados en su entrada estándar con reemplazos seleccionados e imprime el resultado en su salida estándar.tr " " "="
tiene un solo carácter para ser reemplazado - un espacio - y un solo carácter para reemplazarlo - un signo igual. Por lo tanto, convierte cada espacio en su entrada en an=
, y deja el resto sin cambios. Puedes probar eso también:(Escribí el "hola mundo")
Podría tener múltiples reemplazos:
tr abc def
convierte a en d, b en e, c en f, y deja el resto sin cambios. Aquí es solo un personaje, ya que eso era lo queprintf
podía generar a bajo precio.La tubería
|
hace que la salida del comando a la izquierdaprintf %100s
,, se utilice como entrada al comando a la derechatr " " "="
,. Es decir, se asignan cien espacios consecutivostr
, y cada uno de ellos se reemplaza por un=
, con la nueva cadena impresa.fuente
printf '%100s' ' ' | tr " " "="