vi 搜索范围和替换

Lan*_*rts 2 vi regular-expression

我在vi不允许我使用这些\1方法的 Tru64 系统上使用。

这么简单的问题我找不到答案:

您如何将搜索(范围)与替换连接起来?看起来像这样的东西,但它不起作用:

:/^group/s/\w$/Test/
Run Code Online (Sandbox Code Playgroud)

对于那些感兴趣的人,我试图用以下方法做到这一点\1

:%s/\(group\s\+\)\w/\1Test/
Run Code Online (Sandbox Code Playgroud)

Kus*_*nda 5

这里的主要问题是速记符号\w\s. 如果编辑器是(Bill Joy 的原始来源)的传统实现vi,那么您可能还想设置magic在大多数现代实现中默认设置的选项vi。这是通过:set magic.


vi不理解\w\s类似的各种字符类的速记符号vim

要在 中进行替换vi,请使用

:%s/^\(group[  ][  ]*\)[0-9A-Za-z_]/\1Test/
Run Code Online (Sandbox Code Playgroud)

根据vim文档\w对应于[0-9A-Za-z_]\s是空格或标签(有一个空间,并在这两个选项卡[ ]上方)。

E+图案,其中E一些表达,可以通过更换EE*

\1在所述取代的替换部分应该是工作在vi(任意vi)。如果没有,请尝试nvi("new vi") 或查看您是否能够安装vim.

vi(打包为traditional-vi至少一些BSD系统上)需要有其“特殊字符”(除了^$)逃跑了,就像\*\.等。或者,你可以通过设置magic与选项:set magic(这通常是在现代的默认vi实现)。

上述替换将替换所有出现的(例如)

group 1
Run Code Online (Sandbox Code Playgroud)

group Test
Run Code Online (Sandbox Code Playgroud)

做你尝试过的同样事情的另一种方式:

:g/^group/s/[0-9A-Za-z_]$/Test/
Run Code Online (Sandbox Code Playgroud)

要不就

:g/^group/s/.$/Test/
Run Code Online (Sandbox Code Playgroud)

如果你不需要太小心行上的最后一个字符。

如果您想替换该行的最后一个单词(不仅仅是最后一个字符):

:g/^group/s/[^ ]*$/Test/
Run Code Online (Sandbox Code Playgroud)

vi没有设置magic选项的传统中,这可能要写

:g/^group/s/\[^ ]\*$/Test/
Run Code Online (Sandbox Code Playgroud)