我最近看到了一个替代命令,其中作者用类似这样的/替换了!:s!abc!ABC!g

我试图找到一些有关此用法的文档,但找不到任何相关的文档。因此,我尝试自己进行实验,但我再也无法弄清两个标志之间的真正区别。我发现的是:


不可能在命令中混合使用!/。例如,:s!abc/ABC发生故障。
使用!以避免在模式中转义/可能会很有用。例如,如果要将</替换为%,可以使用:%s!</!%!g而不是:%s/<\//%/g
似乎在某些情况下某些正则表达式不能与/一起使用,而不能与!一起正常使用,但是由于我不是真正的正则表达式专家,因此我不确定。

所以我的问题很简单:在替代命令中使用!有什么好处,何时决定代替/使用它?

评论

该问题也已发布到Stack Overflow

确实,我在几分钟前错误地标记了一个双重帖子,以知道该怎么做。

#1 楼

:help :global开始:


代替{pattern}周围的'/',您可以使用任何其他
单字节字符,但不能使用字母字符'\',' “'或'|'。
如果要在搜索模式中包含'/'或
替换字符串,则很有用。


是根据您的实验设计的,目的是预防所谓的“倾斜牙签综合征”。请考虑以下问题:

:%s/\/home\/martin\/test/\/home\/jake\/x/


与之相对:

:%s!/home/martin/test!/home/jake/x!


第二种形式显然更具可读性。

这是您可以更改定界符的唯一原因;使我们对人类更易读。

顺便说一下,其他一些程序甚至更加灵活,例如,在GNU sed中,您可以根据需要使用x作为分隔符。sed sxaxbxg filesed s/a/b/g file相同。

评论


至于可读性,我更喜欢(并建议):%s @ / home / martin / test @ / home / jake / x @,因为“胖” @使得查看语句的各个部分从何处开始更加容易/结束。

–DevSolar
15年2月2日在15:32

@DevSolar我发现:%s#/ home / martin / test#/ home / jake / x#效果更好,但这只是个人观点。

–阿米特金
16年8月29日在14:44