Je voudrais utiliser la substitution de variable sur une chaîne particulière à laquelle j'accède via une commande. Par exemple, si je copie quelque chose dans mon presse-papiers, je peux y accéder comme ceci.
$ xclip -o -selection clipboard
Here's a string I just copied.
Si je l'assigne à une variable, alors je peux faire une substitution de variable dessus.
$ 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.
Cependant, existe-t-il un moyen de faire une substitution de variable sans l'assigner à une variable? Conceptuellement, quelque chose comme ça.
$ echo ${$(xclip -o -selection clipboard)/copi/knott}
bash: ${$(xclip -o -selection clipboard)/copi/knott}: bad substitution
Cette syntaxe échoue, car var
devrait être un nom de variable, pas une chaîne.
bash
. (Et me pousse à nouveau vers la migration verszsh
.)Oui, vous pouvez le faire - en quelque sorte. Ce n'est vraiment pas joli. C'est plus comme en ligne qu'imbriqué. Le problème est que vous devez opérer sur la valeur du paramètre que vous développez - si ce paramètre n'a pas de valeur, vous ne ferez pas grand-chose. Ainsi, vous pouvez attribuer la valeur tout en la développant et ce n'est guère un raccourci.
J'utilise l'
$0
extension param dans la chaîne pour masquer l'affectation. Il affecte la valeur de la var dans une extension d'affectation imbriquée. L'extérieur a la priorité - mais comme il s'étendrait à tout ce que fait l'intérieur, c'est difficile à dire. Cependant, si nous faisons taire l'expansion intérieure, puis la modifions, vous pouvez obtenir ce que vous voulez. Après avoir copié votre chaîne dans mon presse-papiers (je n'ai pasxclip
- justexsel
), elle affiche:C'est un peu plus clair ce qui se passe si vous omettez
$0
, cependant:Cela imprime:
... car l'affectation interne se produit avant la modification, mais, comme indiqué, l'affectation externe a priorité - et elle s'étend à la fois à l'expansion de l'affectation interne et à l'expansion interne modifiée.
Bien sûr, rien de tout cela ne fonctionne du tout si le paramètre ciblé est déjà affecté - vous ne pouvez donc le faire sûrement que si vous videz la variable en premier lieu ... ce qui, honnêtement, est probablement le moment le plus approprié pour l'affecter après tout .
la source
alias
indirection pour la rendre un peu plus pratique - mais si cela en vaut la peine, vous devez configurer une fonction pour gérer les devis sécurisés et faire quelque chose aveceval
ou quelque chose comme ça de toute façon. w /eval
- si vous pouvez rendre les premiers caractères de la quantité de sortie du sous-commande à une syntaxe d'expansion exploitable - alors vous pouvez probablement aller beaucoup plus loin beaucoup plus facilement. Je sais qu'une telle chose serait facile avecxsel
- cela prend stdin - maisxsel
?Si vous ne souhaitez pas créer une variable, il existe d'autres façons d'effectuer une substitution de chaîne:
la source
sed
place, mais c'était censé être plus une question générale, sur l'imbrication des substitutions.