我如何使用 vim 替换所有匹配正则表达式的整行

How can I use vim to substitute all whole lines that match a Regex

我有一个 tex 文件,其中包含如下几个段落:

\paragraph{name1}

...

\paragraph{name2}

...

现在我想用项目替换所有 "paragraph",就像:

\item
...

\item
...

为了达到这个目的,我尝试了很多命令,最后我使用了这个: (请注意,我使用 "a:" 到 "z:" 作为段落名称)

**:% s/\paragraph[{][a-z]:[}]/\item/g**

而且我认为这既不美观也不高效。我试图匹配包含 "paragraph" 的行,但不知何故只有这个词被替换了。现在我可以使用

删除所有这些行
**:% g/_*paragraph_*/d**

有没有更好的方式以相同的方式进行替换?(或者说替换所有包含特定单词的行)

您的第一次尝试几乎是正确的。而不是这个

:% s/\paragraph[{][a-z]:[}]/\item/g

使用这个

:% s/^\paragraph{[a-z|0-9]\+}$/\item/g

让我们逐条分解:

  1. ^字符匹配行的开头,所以你不会匹配这样的东西:

    Some text \paragraph{abc}

  2. 之所以用\而不是\是因为\是一个转义符,所以要匹配它,我们对转义符进行转义。

  3. [a-z|0-9]\+ 将匹配一个或多个 a-z 或 0-9 字符,我假设您的段落名称由这些字符组成。如果你需要大写字母,你可以做类似 [a-zA-Z|0-9]\+.

  4. 最后,我们将表达式锚定到 $ 行的末尾,这样它就不会匹配不完全符合此模式的行。

使用 macro 的简单方法! 首先,使用 / 搜索模式,例如 /\paragraph

让我们启动宏。按 qaq 清除寄存器 a。 按 qa 开始在寄存器 a 中记录。 按 n 去它的发生。然后,按 c$ 删除直到行尾并插入文本。然后,键入文本,然后按 escape 键。

@a重复该过程。按 q 结束宏。

现在,宏被记录下来,您可以按一次@a来更改所有这些行。

你可以这样做:

:%s/\paragraph{[^{}]*}/\item/g

这会找到所有出现的 \paragraph{,后跟 0 个或多个非 {} 字符,再后跟 }(即类似 \paragraph{stuff here} 的字符),并替换他们 \item.


或者如果你想替换所有包含 paragraph 的行:

:%s/^.*paragraph.*$/\item/