- Para passar de
~/aaa/foo/bbb
para~/aaa/bar/bbb
, pode-se usarcd foo bar
- e de
~/foobar/foo/www
para~/foobar/bar/www
:cd "/foo/" "/bar/"
Mas como é possível, usando a mesma técnica,
- para passar de
~/aaa/foo/foo/bbb
para~/aaa/bar/bar/bbb
- ou de
~/foobar/foo/foo/www
para~/foobar/bar/bar/www
?
É um recurso copiado do shell Korn que
chdir()
é para um caminho calculado a partir do diretório de trabalho atual ($PWD
) com a primeira ocorrência defoo
substituída porbar
.Isso é tudo que existe. Se quiser qualquer outro tipo de transformação, você precisa fazer manualmente.
Por exemplo, para
cd
todas$PWD
as ocorrências defoo
substituído porbar
, use o estilo csh¹:Ou o estilo Korn²:
(observe que, ao contrário de
cd foo bar
, eles não imprimem o caminho do novo diretório de trabalho).Para você
~/foobar/foo/foo/www
,~/foobar/bar/bar/www
assumindo$HOME
que não contém$HOME
não contém/foo
:Veja também:
Há uma diferença sutil entre os modificadores
f
eg
os modificadores de repetição:g
atua como og
sinalizador do comandosed
des
: substitui todas as ocorrências, procurando por todas essas ocorrências, uma após a outra, em uma passagem na stringfs:string:replacement
repetes:string:replacement
desde o início, desde que faça alguma modificação. Observe que emborag
esteja limitado a trabalhar com:s/string/replacement
,f
pode ser usado com qualquer modificador; por exemplo,$file:fr
é como$file:r
(obter or
nome oot, IOW remover a extensão), exceto que remove todas as extensões.gs:/foo/:/bar/
likesed s:/foo/:/var/:g
mudaria~/foobar/foo/foo/www
para~/foobar/bar/foo/www
only, porque depois que o primeiro/foo/
foi substituído por/bar/
,s
continua procurando outras ocorrências no que sobrou mas é aquelefoo/www
que não contém nenhum/foo/
.While
fs:/foo/:/bar/
é mais parecido comsed -e :1 -e s/foo/bar/ -e t1
³ e funciona porques
é chamado primeiro/home/you/foobar/foo/foo/www
e depois/home/you/foobar/bar/foo/www
.Observe também que in
$var:s/foo/bar
,foo
é considerado uma string fixa (a menos que ahistsubstpattern
opção esteja definida), enquanto in${var/foo/bar}
, é considerado um padrão. A próxima versãozsh
terá$var:S/foo/bar
ondefoo
é considerado um padrão, independentemente da configuração dahistsubstpattern
opção.Outra abordagem para substituir todos os componentes do caminho
foo
como um todo (incluindo o último que a abordagem acima não aborda) seria/
/
Aqui, usando a extensão do zsh
${var:/pattern/replacement}
sobre o ksh${var/pattern/replacement}
para que o padrão corresponda apenas à string inteira.Ou, com
histsubstpattern
(ou:S
na próxima versão), use oW[/]
modificador para os
modificador agir em cada ordem/
separadaW
:(onde
#
ancora o padrão no início e%
no final 4 ).¹ Bem, tecnicamente, é
:s/string/replacement
decsh
, masg
é uma extensão zsh, semelhante à de tcsha
.$PWD
vem de ksh, embora tcsh tenha$cwd
como equivalente. Claro, em (t)csh, como sempre, você também precisaria de a:q
para "citar" o resultado.² Bem, em ksh, como sempre, você também precisaria citar a expansão para evitar split+glob
³ isso não é estritamente equivalente, pois
sed
o 'st1
repetiria (ramificação para o:1
rótulo) se alguma substituição fosse feita, enquanto o zsh's:fs/pattern/replacement/
se repetiria se uma substituição fosse feita e resultasse em uma alteração . Por exemplo, withs/foo/foo/
,sed
seria executado em um loop infinito, enquantozsh
'sf
pararia imediatamente.4 como no ksh,
${var/pattern/replacement}
exceto que o ksh não pode combinar os dois.A forma de dois argumentos
cd
executa apenas uma única substituição. Você terá que usar uma técnica diferente.Você pode usar modificadores de histórico para
$PWD
realizar substituições que podem ser encadeadas.No entanto, é difícil fazer substituições complexas. O que costumo fazer nesses casos é editar
PWD
: digite$PWD
e pressione Tabpara substituir a expansão da variável pelo seu valor, depois edite os locais que desejo modificar. Dependendo das configurações de conclusão e das combinações de teclas, pode ser necessário pressionar uma tecla diferente para expandir o valor da variável, em vez de concluir preservando a expansão.