为什么在vim -c参数中需要2个反斜杠来转义反斜杠?



在Windows 10中,我在Git bash 1.9.5中使用了以下命令,

$ vim -c "%s/^/=line(".").'. '/g" -c "%s///\/g" -c "%y+" -c "wq" ~/Desktop/sample.txt

in order to,

  1. -c "%s/^/=line(".").'. '/g":每行前添加一串数字。
  2. -c "%s///\/g":将所有斜杠替换为反斜杠
  3. -c "%y+" -c "wq":复制所有文本到剪贴板,保存&退出Vim。

除了2之外,一切都很好,-c "%s///\/g"参数似乎不能被Vim正确处理。没有替换斜杠,并且在每行的第一个/之后插入g。例如,

之前Sample.txtA/p/A/T/H
B/p/A/T/H

后Sample.txt<<p>/g/strong>P/B/T/H
/gP/A/T/H

然而,如果我在vim中执行:%s///\/g,它将像我预期的那样工作。

此外,我试过这些,

  • -c "%s///@/g"可以代替所有/@
  • -c "%s,/,\,g"将每行的第一个/替换为,g

所以,我想知道这是-c参数的限制或已知问题,还是我在某个地方犯了错误?

编辑我只是偶然发现-c "%s///\/g"可以正常工作。
那么谁能解释一下为什么需要另一个来逃避呢?

在Vim中,当使用正则表达式时,反斜杠用于转义字符,因此它不能单独用于表示文字反斜杠。为此,必须用转义反斜杠转义文本反斜杠:

:%s///\/g

开始两个反斜杠:转义斜杠和字面斜杠。这是Vim所期望的。

在shell中,反斜杠也有特殊的含义。当在双引号内时,两个连续的反斜杠';所以,当你认为你在告诉Vim做:

:%s///\/g

:

-c "%s///\/g"

实际接收到的是:

%s////g

的意思是:用转义斜杠(即简单斜杠)替换每个斜杠,然后是字母g"和你想的不太一样。

要确保Vim实际接收到正确的命令,您需要添加第三个反斜杠:

-c "%s///\/g"

两个反斜杠被折叠成一个,另一个保持不变,所以你最终得到两个反斜杠,这是Vim期望的:

%s///\/g

另一个,更好的方法是使用单引号,其中反斜杠总是字面意思,而不是双引号:

-c '%s///\/g'

从这一页关于shell引用,强调我的:

只有当后面跟着美元、反斜杠、双引号、反斜杠或换行符时,反斜杠才保留其含义。在双引号中,当后面跟着以下字符之一时,将从输入流中删除反斜杠。

相关内容

  • 没有找到相关文章

最新更新