vi 模式下的命令行:全部替换

vi 模式下的命令行:全部替换

如何在 vi 模式下从命令行进行全局替换。似乎我无法通过添加前缀来使用 ex 命令:,那么我该怎么办呢?

例如,如果我想将命令中的所有\内容替换为.../

答案1

我会用bash历史机制:

$ echo 'foo\bar\baz'
foo\bar\baz
$ !!:gs/b/B/
echo 'foo\Bar\Baz'
foo\Bar\Baz

但是,我似乎无法用它来替换反斜杠

$ echo 'foo\bar\baz'
foo\bar\baz
$ !!:gs/\\/\//
bash: :gs/\\/\//: substitution failed

答案2

在 vi 命令模式下

:1,$s+\\+/+g

这会将所有反斜杠字符替换为正斜杠`

答案3

vi提供了不止一种方法来做到这一点。讲话全部ex行(“:”行)中,您可以使用%1,$。同样,它允许不同的分隔符s(替代命令)。所以你可以有这些变化:

:%s/\\/\//g
:%s,\\,/,g
:1,$s/\\/\//g
:1,$s,\\,/,g

重点是

  • 反斜杠是一个用于替换的正则表达式的字符,并且必须是逃脱了使用它,
  • 分隔符必须是标点符号,并且
  • 最后,(在第一个和第三个示例中),可以使用分隔符作为之前/之后字符串的一部分,但在这种情况下它也必须被转义。

答案4

如果您在 vi 内全局用 / 替换 \ 时遇到问题,那是因为第一个字符很特殊并且需要转义,而第二个字符通常被选为 sed 分隔符,因此也需要转义。您可以使用:

:%!tr '\\' '/'

或者

:%s,\\,/,g

或者

:%s/\\/\//g

为了完整起见,如果您使用普通 vi (不带宏)并且不想使用 ex 模式,则必须执行以下操作:

/\\
r/nr/nr/nr/nr/nr/nr/nr/nr/nr/nr/n

根据需要多次重复最后的内容,我只是将其包括在内以显示如果您不想使用前模式则必须执行的操作。

相关内容