Eu gostaria de usar a substituição de variável em uma sequência específica que eu acesso através de um comando. Por exemplo, se eu copiar algo para a minha área de transferência, posso acessá-lo assim.
$ xclip -o -selection clipboard
Here's a string I just copied.
Se eu atribuí-lo a uma variável, então posso fazer a substituição da variável.
$ 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.
No entanto, existe uma maneira de fazer a substituição de variáveis sem atribuí-la a uma variável? Conceitualmente, algo assim.
$ echo ${$(xclip -o -selection clipboard)/copi/knott}
bash: ${$(xclip -o -selection clipboard)/copi/knott}: bad substitution
Essa sintaxe falha, porque var
deve ser um nome de variável, não uma sequência.
bash
. (E me empurra de novo para migrar parazsh
.)Sim, você pode fazer isso - mais ou menos. Realmente não é bonito. É mais como alinhado do que aninhado. O problema é que você precisa operar com o valor do parâmetro expandido - se esse parâmetro não tiver valor, você não fará muito. Portanto, você pode atribuir o valor enquanto o expande e dificilmente é um atalho.
Eu uso a
$0
expansão de parâmetros dentro da cadeia para ocultar a atribuição. Ele atribui o valor do var dentro de uma expansão de atribuição aninhada. O exterior tem precedência - mas, como seria expandido para o que o interior faz, é difícil dizer. No entanto, se silenciarmos a expansão interna, modificá-la, você poderá obter o que deseja. Depois de copiar sua string para a minha área de transferência (não tenhoxclip
- apenasxsel
), ela é impressa:É um pouco mais claro o que está acontecendo se você deixar de
$0
fora:Isso imprime:
... porque a atribuição interna ocorre antes da modificação, mas, como observado, a atribuição externa tem precedência - e se expande tanto para a expansão da atribuição interna quanto para a expansão interna modificada.
É claro que nada disso funcionar em todos, se o parâmetro alvo é já atribuído - assim você só pode fazê-lo, certamente, se você esvaziar a variável em primeiro lugar ... o que, honestamente, é provavelmente o momento mais conveniente para atribuí-lo depois de tudo .
fonte
alias
engano para torná-lo um pouco mais conveniente - mas se vale a pena para você, então você deve configurar uma função para um manuseamento seguro-cotação e fazendo algo w /eval
ou algo parecido de qualquer maneira. w /eval
- se você pode fazer com que os primeiros caracteres da saída do subcomando atinjam a sintaxe de expansão viável - provavelmente será mais fácil. Eu sei que isso seria fácil c /xsel
- é preciso stdin - masxsel
?Se você não deseja criar uma variável, existem outras maneiras de executar a substituição de string:
fonte
sed
lo, mas era para ser uma pergunta mais geral sobre aninhamento de substituições.