【问题标题】:Why 2 backslashes are needed to escape a backslash in vim -c argument?为什么需要 2 个反斜杠来转义 vim -c 参数中的反斜杠?
【发布时间】:2021-01-26 11:33:22
【问题描述】:

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

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

为了,

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

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

之前的示例.txt

A/P/A/T/H
B/P/A/T/H

Sample.txt 之后

A/gP/A/T/H
B/gP/A/T/H

但是,如果我在 vim 中执行 :%s/\//\\/g,它会按预期工作。

另外,这些我都试过了,

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

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

编辑:我偶然发现-c "%s/\//\\\/g" 按预期工作。
那么谁能解释一下为什么需要另一个\ 来逃避\

【问题讨论】:

  • 请注意,这与 Git 没有任何关系,与 vim 也没有太大关系。作为romainl explains,这里的问题在于你的shell。 (“Git bash”是 bash 到 Windows 的一个端口,而不是 Git 本身的一部分。)

标签: bash git shell vim


【解决方案1】:

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

:%s/\//\\/g

所以无论如何你都从 两个 反斜杠开始:转义反斜杠和文字反斜杠。这正是 Vim 所期望的。

在你的 shell 中,反斜杠也有特殊的含义。当在双引号内时,两个连续的反斜杠“折叠”成一个,所以当你认为你在告诉 Vim 这样做时:

:%s/\//\\/g

与:

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

它实际收到的是:

%s/\//\/g

这意味着:“用转义的斜杠(所以是一个简单的斜杠)替换每个斜杠,然后是字母 g”。不完全是你的想法。

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

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

两个反斜杠折叠成一个反斜杠,另一个保持原样,因此您最终会得到 两个 反斜杠,这正是 Vim 所期望的:

%s/\//\\/g

另一种更好的方法是使用单引号,其中反斜杠始终是文字,而不是双引号:

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

From this page about shell quoting,强调我的:

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

【讨论】:

    猜你喜欢
    • 2011-01-23
    • 1970-01-01
    • 2021-11-16
    • 1970-01-01
    • 2013-11-10
    • 1970-01-01
    • 1970-01-01
    • 2016-03-12
    相关资源
    最近更新 更多