在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,
-c "%s/^/=line(".").'. '/g"
:每行前添加一串数字。-c "%s///\/g"
:将所有斜杠替换为反斜杠-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引用,强调我的:
只有当后面跟着美元、反斜杠、双引号、反斜杠或换行符时,反斜杠才保留其含义。在双引号中,当后面跟着以下字符之一时,将从输入流中删除反斜杠。