Vim-Vi //替代模式

时间:2018-12-23 23:47:47

标签: vim replace find vi

我有一个XML文件,如下所示:

<Word name="name1" WordID="...">
</Word>

我需要在整个文件的这两行之前插入2个额外的前导空格 有任何想法吗? -谢谢!

2 个答案:

答案 0 :(得分:2)

尝试:

%s/^\(<\/*[Ww]ord.*\)$/  \1/

%表示整个文件。

s表示替代

^表示行首

$表示行尾

<是尖括号

。*表示任何字符零次或多次

(和)包含要保留的正则表达式

\ 1表示应将保留的正则表达式插入到哪里。

/之后和\1之前,插入任意数量的空格。

当您在\(\)之间写一个表达式时,它会被记录,以后可以与\N一起使用,其中N是一个数字。 例如,这里\1表示匹配的第一个表达式。 如果您第二次使用\(\),则可以使用\1\2分别包含第一个和第二个。

例如,

s/\(first\)\(second\)/\1 \2/

将在第一和第二个单词之间插入一个空格

答案 1 :(得分:1)

替代:全局命令。

全局命令作用于整个文件,并在与模式匹配的每一行上执行(Ex)操作。它是grep:global/re/print)的灵感来源,斜视时类似于awk

我们在这里的作用是插入两个空格,从语义上讲,substitute不能很好地捕捉到我的大脑。

由于我们需要一个Ex命令,因此我们使用:normal!执行一个没有应用任何映射的普通命令,然后简单地I在该行的开头插入两个空格。

(我从N Sarj’s answer复制并编辑了图案)

:global ~</\?[Ww]ord~ normal! I  

请注意I之后的两个尾随空格。

在这里,我使用~作为模式分隔符,因为任何字符都可以,并且不使用标准的/意味着我不需要在模式中对其进行转义。

我们仍然必须对?进行转义,以使其具有“零或一”的特殊含义(与匹配文字?相对)。