- 要从 移动
~/aaa/foo/bbb
到~/aaa/bar/bbb
,可以使用cd foo bar
- 以及从
~/foobar/foo/www
到~/foobar/bar/www
:cd "/foo/" "/bar/"
但如何才能用同样的技术,
- 从 移动
~/aaa/foo/foo/bbb
到~/aaa/bar/bar/bbb
- 或从
~/foobar/foo/foo/www
到~/foobar/bar/bar/www
?
~/aaa/foo/bbb
到~/aaa/bar/bbb
,可以使用cd foo bar
~/foobar/foo/www
到~/foobar/bar/www
:cd "/foo/" "/bar/"
但如何才能用同样的技术,
~/aaa/foo/foo/bbb
到~/aaa/bar/bar/bbb
~/foobar/foo/foo/www
到~/foobar/bar/bar/www
?
是从 Korn shell 复制的一个功能,它
chdir()
指向一个根据当前工作目录 ($PWD
) 计算的路径,其中第一次出现的foo
替换为bar
。这就是全部了。如果您想要任何其他类型的转换,则需要手动进行。
例如,要将
cd
所有$PWD
出现的foo
替换为bar
,可以使用 csh-style¹:或者 Korn 风格²:
(请注意,与相反
cd foo bar
,这些不会打印新工作目录的路径)。对于您的
~/foobar/foo/foo/www
,~/foobar/bar/bar/www
假设$HOME
不包含$HOME
不包含/foo
:参见:
f
和重复修饰符之间有细微的差别g
:g
作用类似于命令g
的标志:它替换所有出现的情况,在字符串中一次依次查找所有这些出现的情况sed
s
fs:string:replacement
重复。请注意,while仅限于与 一起使用,可以与任何修饰符一起使用;例如类似于(获取oot 名称,换句话说,删除扩展名),但它会删除所有扩展名。s:string:replacement
g
:s/string/replacement
f
$file:fr
$file:r
r
gs:/foo/:/bar/
likesed s:/foo/:/var/:g
会变成~/foobar/foo/foo/www
only~/foobar/bar/foo/www
,因为在第一个/foo/
被 替换后/bar/
,s
会继续在剩下的 中搜索其他出现的位置,但是foo/www
不包含任何/foo/
。虽然
fs:/foo/:/bar/
更像sed -e :1 -e s/foo/bar/ -e t1
³并且有效,因为s
首先调用/home/you/foobar/foo/foo/www
然后调用/home/you/foobar/bar/foo/www
。还要注意,在 中
$var:s/foo/bar
,foo
被视为固定字符串(除非histsubstpattern
设置了选项),而在 中${var/foo/bar}
, 它被视为模式。无论选项设置如何,的下一个版本zsh
都将$var:S/foo/bar
where视为模式。foo
histsubstpattern
另一种替换所有路径组成部分
foo
(包括上述方法未解决的最后一个部分)的方法是/
/
这里使用 zsh 的
${var:/pattern/replacement}
扩展而不是 ksh 的扩展${var/pattern/replacement}
来使模式仅匹配整个字符串。或者,使用修饰符
histsubstpattern
(或:S
在下一个版本中)对每个以-separated结尾的 ord进行作用:W[/]
s
/
W
(其中,
#
将模式锚定在开始处,以及%
结束处4)。¹ 嗯,从技术上讲, 来自
:s/string/replacement
,csh
但g
它是 zsh 扩展,类似于 tcsh 的a
。$PWD
来自 ksh,尽管 tcsh 有$cwd
一个等价的 。 当然,在 (t)csh 中,像往常一样,您还需要一个:q
来“引用”结果。² 嗯,在 ksh 中,像往常一样,你还需要引用扩展以防止 split+glob
³ 这并不完全等同,因为如果进行了任何替换,
sed
'st1
会重复(分支到标签),而如果进行了替换并导致更改,则:1
zsh会重复。例如,会无限循环运行,而's会立即停止。:fs/pattern/replacement/
s/foo/foo/
sed
zsh
f
4与 ksh 类似,
${var/pattern/replacement}
但 ksh 不能将两者结合起来。双参数形式
cd
仅执行一次替换。您必须使用其他技术。您可以使用历史修饰符来
$PWD
执行可链接的替换。不过,进行复杂的替换很难理解。在这种情况下,我通常会编辑
PWD
:输入$PWD
然后Tab按以用变量扩展值替换变量扩展,然后编辑要修改的位置。根据您的补全设置和键绑定,您可能需要按不同的键来扩展变量的值,而不是在保留扩展值的同时进行补全。