Substituição aninhada no ZSH

1

Eu uso zsh .

Digamos, por exemplo, que eu queira remover o diretório atual de cdpath . Isso significa que eu preciso remover um elemento baseado no conteúdo, que se encaixa bem no padrão ${name:#to_be_removed} . Mas há um problema: to_be_removed é o resultado da substituição (a saber, $(pwd)/ ). Como eu conseguiria isso em uma elegante fasion? O melhor que eu consegui é isso:

cdpath=("${(s/ /)$(eval echo $(echo "\${(@)cdpath:#${$(pwd)}/}"))}")

Este é um caso de uso comum para mim, e ter toneladas dessa bagunça * SH está começando a me dar nos nervos ...

Obrigado PythonNut

    
por PythonNut 21.01.2014 / 01:14

1 resposta

1

Se você quiser remover o diretório atual do array $cdpath , eu simplesmente usaria

cdpath=(${cdpath/(#s)$PWD(#e)})

(#s) e (#e) têm a mesma finalidade que as expressões regulares ^ e $ em "normal", ou seja, início e fim da sequência. Por favor, note : Estes precisarão de setopt EXTENDED_GLOB para funcionar!

Se você precisar de um comando externo,

cdpath=(${cdpath/(#s)${$(some_command)}})

deve funcionar.

Caso de teste:

$ setopt EXTENDED_GLOB
$ cdpath=(/foo /foo/bar /bar)
$ pwd
/bar
$ cdpath=(${cdpath/(#s)${$(builtin pwd)}})
$ print -l $cdpath
/foo
/foo/bar
    
por 22.01.2014 / 12:43

Tags