¿Cómo son los replstrs {}?

¿Cómo son los replstrs {}?

En la documentación xargsse menciona un "replstr" que -Itoma la bandera. Comencé a leer sobre esto cuando encontré este comando para ejecutar fswatch:

fswatch -0 -e ".*" -i ".rb" . | xargs -0 -n 1 -I {} ruby {}

y comencé a leer la página de manual dexargs

-I replstr
        Execute utility for each input line, replacing one or more occurrences of replstr in up to replacements (or 5 if no -R flag is
        specified) arguments to utility with the entire line of input.  The resulting arguments, after replacement is done, will not be
        allowed to grow beyond 255 bytes; this is implemented by concatenating as much of the argument containing replstr as possible, to
        the constructed arguments to utility, up to 255 bytes.  The 255 byte limit does not apply to arguments to utility which do not
        contain replstr, and furthermore, no replacement will be done on utility itself.  Implies -x. 

Pensar en el término "replstr" parece que probablemente signifique algo así como "leer evaluar cadena de bucle de impresión", ¿es esto lo que significa? Comencé a jugar con él para tratar de tener una idea de lo que {}está haciendo, pero no estoy seguro de entenderlo todavía:

➜  scripts git:(master) ✗  {0..3}
zsh: command not found: 0..3
➜  scripts git:(master) ✗ echo {0..3}
0 1 2 3
➜  scripts git:(master) ✗ echo {a..3}
a ` _ ^ ] \ [ Z Y X W V U T S R Q P O N M L K J I H G F E D C B A @ ? > = < ; : 9 8 7 6 5 4 3
➜  scripts git:(master) ✗ echo {a..d}
a b c d
➜  scripts git:(master) ✗ echo cats and dogs | xargs
cats and dogs
➜  scripts git:(master) ✗ echo cats and dogs | xargs {}
xargs: {}: No such file or directory
➜  scripts git:(master) ✗ echo cats and dogs | xargs {} echo {}
xargs: {}: No such file or directory
➜  scripts git:(master) ✗ echo cats and dogs | xargs -I {}

➜  scripts git:(master) ✗ echo cats and dogs | xargs -I {} echo {}
cats and dogs

Por ejemplo, echo {a..3}realmente no tiene sentido para mí. Definitivamente parece que está haciendo algo como "sustituir esta lista de cadenas aquí", pero no estoy seguro de si esa es la forma correcta de verlo. Además, no estoy seguro de si {}es un tipo específico de replstr y si hay más o si replstr es cualquier cosa entre un par de llaves. Me encantaría recibir orientación sobre replstr y cómo abordarlos.

Respuesta1

replstrsignifica "cadena de reemplazo" o "cadena de reemplazo".

La respuesta original es {}. Se introdujo por primera vez con la cláusula findde comando execdonde se reemplazaba por cada nombre de archivo encontrado, por ejemplo

find /tmp -name "foo*" -exec echo file {} found \;

Se mostrará, suponiendo que dos archivos coincidan con el patrón:

file foo1 found
file foo2 found 

El xargscomando permite hacer lo mismo con argumentos creados a partir de cadenas pasadas a su entrada estándar, y también permite especificar algo diferente {}a una cadena de reemplazo.

Tenga en cuenta que el replstr predeterminado no tiene {}nada dentro de las llaves, estas últimas se usan para diferentes propósitos, por ejemplo, rangos como ya notó o expansión de parámetros.

Respuesta2

El -Iargumento funciona así: -I whateversignifica que las apariciones literalmente de whateverson reemplazadas por el argumento del comando. Manifestación:

$ echo "a
b
c" | xargs -I f echo hey f hey f
hey a hey a
hey b hey b
hey c hey c

¿Ver? xargstomó cada una de las líneas a, by c, y las sustituyó en lugar de fen echo hey f hey f.

No hay ningún {}involucrado.

La -Iopción es POSIX. GNU xargsdocumenta una -iopción obsoleta que, si se invoca, -iwhateverse comporta como -I whatever. Si se invoca simplemente, -ise comporta como -I {}. En este caso, {}se reemplazan las apariciones de. {}está claramente inspirado en una característica de find: su -execpredicado.

La sintaxis {a..b}de foo{a,b,c}barBash procesada por su "expansión de llaves". {}no tiene ningún significado especial y se pasa a un comando tal como está. (Si no lo fuera, rompería findlas invocaciones que se producen comúnmente y que cumplen con los estándares).

Respuesta3

el {...}es elexpansión de la abrazadera del caparazón, que admite listas como {a,b,c}(se expande a ay b) cy secuencias de números como {0..13}(se expande a los números 0, 1... 12, 13) o caracteres {a..d}( a, b, c, d). (La expansión de llaves no tiene nada que ver con el {}marcador de posición utilizado por xargs).

La secuencia algo extraña que {a..3}se expande se explica por eltabla de caracteres ASCII. Como ano es un número, ambos se toman como caracteres, y la expansión son todos los caracteres entre ay 3por el valor numérico de los códigos de caracteres. Da la casualidad de que aviene después 3, por lo que la secuencia va hacia abajo a través de las letras mayúsculas y los números del 9 al 3.

Como se ve, mezclar letras y números en un rango como ese no es muy útil, pero {a..z}podría {A..Z}serlo, así como lo similar [a-z]en [A-Z]expresiones regulares y globos de shell. (Es decir, si puedes ignorar el resto de las letras).

información relacionada