在vim命令模式下单引号和双引号之间有什么不同吗?

时间:2013-12-29 11:52:39

标签: vim

在我的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

我的系统是Windows的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”

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

无法找到sed命令。

3 个答案:

答案 0 :(得分:3)

很有趣,当我尝试:%!sed "/^/ /"时,我收到与使用单引号时相同的错误消息:

sed: 1: "/^/ /": invalid command code /

(这一行替换了我文件的内容。)我希望在那里收到一条错误信息,因为正如@Birei指出的那样,你省略了sed s 命令。这可以按预期工作,使用单引号或双引号:

:%!sed "s/^/ /"

@Birei也是对的,你可以使用vim做这样的事情,但我认为你已经简化了你真正想做的事情。

为了回答原始问题,Vim对文字字符串使用单引号。文字字符串中唯一的特殊字符是'本身。用双引号分隔的字符串使用 \ 来表示特殊字符,例如`“\< Esc>”。

:echo 'a''b' == "a'b"
:help expr-string
:help literal-string

答案 1 :(得分:2)

  

我的系统是xp + vim 7.3 for windows

默认情况下,Vim使用cmd.exe在Windows上运行:!命令,对于来自POSIX shell的引用,您的s/w/haha/示例建议您进行测试时,其行为会有所不同。尝试像

这样的东西
:set shell=\"C:\path\to\sh.exe\"\ -f

告诉它使用你的POSIX shell。或者,如果您正在使用cygwin,请尝试使用vim的cygwin版本而不是Windows本机版本。

答案 2 :(得分:0)

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

sed "s/$pattern/$replacement/"

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

:%!sed "s/^/ /"

如果没有外部命令,内部也可以有相同的行为,例如:

:%s/^/ /