在替代命令中用感叹号(!)替换斜杠(/)是什么意思?


13

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

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

  • 这不是可以混合!/中的命令。例如:s!abc/ABC失败。
  • !用来避免/在模式中转义可能会很有用。例如,如果要替换为</%可以使用:%s!</!%!g代替:%s/<\//%/g
  • 似乎在某些情况下某些正则表达式无法使用/且不能正常使用,!但是由于我不是真正的正则表达式专家,因此我不确定。

所以我的问题很简单:!在替代命令中使用的优势是什么?何时应该决定使用替代命令/


这个问题
Martin Tournoij

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

Answers:


22

来自:help :global

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

正如您已经根据实验设计的那样,这是为了防止所谓的“ 倾斜牙签综合症 ”。考虑一下:

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

与:

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

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

这是可以更改定界符的唯一原因。使它对我们人类更具可读性。电脑不在乎。

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


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

我发现@DevSolar的:%s#/home/martin/test#/home/jake/x#效果更好,但这只是个人观点。
阿米特·金
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.