Me gustaría usar la sustitución de variables en una cadena particular a la que accedo mediante un comando. Por ejemplo, si copio algo en mi portapapeles, puedo acceder a él de esta manera.
$ xclip -o -selection clipboard
Here's a string I just copied.
Si lo asigno a una variable, entonces puedo hacer una sustitución de variables en él.
$ var=$(xclip -o -selection clipboard)
$ echo $var
Here's a string I just copied.
$ echo ${var/copi/knott}
Here's a string I just knotted.
Sin embargo, ¿hay alguna forma de hacer una sustitución de variables sin asignarla a una variable? Conceptualmente, algo como esto.
$ echo ${$(xclip -o -selection clipboard)/copi/knott}
bash: ${$(xclip -o -selection clipboard)/copi/knott}: bad substitution
Esta sintaxis falla, porque var
debería ser un nombre de variable, no una cadena.
bash
. (Y me empuja nuevamente hacia la migraciónzsh
).Sí, puedes hacer eso, más o menos. Realmente no es bonito. Es más como en línea que anidado. El problema es que tiene que operar sobre el valor del parámetro que expande; si ese parámetro no tiene valor, entonces no hará mucho. Por lo tanto, puede asignar el valor mientras lo expande y apenas es un atajo.
Utilizo la
$0
expansión param dentro de la cadena para ocultar la tarea. Asigna el valor de var dentro de una expansión de asignación anidada. Lo externo tiene prioridad, pero debido a que simplemente se expandiría a lo que sea que haga el interno, es difícil saberlo. Sin embargo, si silenciamos la expansión interna, luego modifíquela, puede obtener lo que desea. Después de copiar su cadena en mi portapapeles (no tengoxclip
, soloxsel
) imprime:Sin
$0
embargo, es un poco más claro lo que sucede si lo dejas afuera:Que imprime:
... porque la asignación interna ocurre antes de la modificación, pero, como se señaló, la asignación externa tiene prioridad, y se expande tanto a la expansión de la asignación interna como a la expansión interna modificada.
Por supuesto, nada de eso funciona si el parámetro objetivo ya está asignado, por lo que solo puede hacerlo con seguridad si vacía la variable en primer lugar ... lo que, sinceramente, es probablemente el momento más conveniente para asignarlo después de todo .
fuente
alias
indirecta para hacerlo un poco más conveniente, pero si vale la pena, entonces debe configurar una función para manejar las cotizaciones seguras y hacer algo coneval
algo similar de todos modos. w /eval
- si puede hacer que los primeros caracteres de la cantidad de salida del subcomando se conviertan en una sintaxis de expansión factible, entonces probablemente pueda avanzar mucho más fácilmente. Sé que tal cosa sería fácil conxsel
- requiere stdin - peroxsel
?Si no desea crear una variable, existen otras formas de realizar la sustitución de cadenas:
fuente
sed
en su lugar, pero estaba destinado a ser una pregunta más general, sobre la anidación de sustituciones.