在vim命令模式下,单引号和双引号有区别吗?

3

在我的vim中,我可以使用:%!sed "s/^/ /"命令,但当我使用:%!sed 's/^/ /'时,输出结果错误。

sed: -e expression #1, char 0: no previous regular expression

在vim命令模式下,单引号和双引号之间有什么区别吗?在我的sed中,单引号与双引号相同。

$ echo "wha012" | sed  's/w/haha/'
hahaha012

$ echo "wha012" | sed  "s/w/haha/"
hahaha012

我的系统是XP操作系统,使用Vim 7.3版本。

在我的系统中:
[1] "c://cygwin/bin/ash.exe"
[2] "c://cygwin/bin/bash.exe"
[3] "c://cygwin/bin/dash.exe"
[4] "c://cygwin/bin/sh.exe"

如果我在_vimrc文件中设置set shell=\"c:\cygwin\bin\sh.exe"\ -f,我会收到新的错误消息:

找不到sed命令。


你在vim中遇到的问题我们这里无法复现。%!sed '..'%!sed“…”都可以正常工作。 - Kent
3个回答

3
有趣的是,当我尝试使用:%!sed "/^/ /"时,我得到了与使用单引号相同的错误消息:
sed: 1: "/^/ /": invalid command code /

(这行替换了我的文件内容。)我希望在这里得到一个错误信息,因为正如 @Birei 指出的那样,你遗漏了 sed s 命令。这将按预期工作,无论是单引号还是双引号:

:%!sed "s/^/ /"
也说得对,你可以使用vim来完成类似的操作,但我认为你将例子简化了。要回答原问题,Vim在文字串中使用单引号。唯一特殊的字符是'本身。用双引号包围的字符串使用\表示特殊字符,例如`"\<Esc>"。
:echo 'a''b' == "a'b"
:help expr-string
:help literal-string

2

我的系统是XP+Windows下的Vim 7.3

Vim在Windows下默认使用cmd.exe来运行:!命令,与你之前测试过的类似于POSIX shell的s/w/haha/引用方式不同。建议尝试以下方法:

:set shell=\"C:\path\to\sh.exe\"\ -f

如果你想使用POSIX shell代替默认的shell,可以告诉程序这样做。如果你在使用cygwin,则可以尝试使用cygwin版本的vim而不是Windows本地版本。


0

区别在于命令,当您直接从shell执行它时,它允许插值变量:

sed "s/$pattern/$replacement/"

但是你的问题在于你必须使用以字母s开头的替换命令,例如:

:%!sed "s/^/ /"

同时,您也可以在内部实现相同的行为,而无需使用外部命令,例如:

:%s/^/ /

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接