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

时间:2016-06-30 15:50:42

标签: regex vim replace tex

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

\paragraph{name1}

...

\paragraph{name2}

...

现在我要替换所有"段落#34;与项目,就像:

\item
...

\item
...

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

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

我认为这是非常有效的。我试图匹配包含"段"但不知何故只有这个词被取代了。现在我可以用

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

无论如何更好地以相同的方式执行替换?(或者说替换所有行包含特定的单词)

3 个答案:

答案 0 :(得分:2)

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

:% 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. 之类的操作
  5. 最后,我们将表达式锚定到$行的末尾,这样它就不会与不完全符合此模式的行匹配。

答案 1 :(得分:0)

使用macro的简单方法! 首先,使用像/

这样的/\paragraph搜索模式

让我们开始宏。按a清除注册qaq。 按qa开始在注册a中录制。 按n即可显示。然后,按c$删除直到行尾并插入文本。然后,键入文本,然后按escape键。

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

现在,录制了宏,您可以按@a一次以对所有这些行进行更改。

答案 2 :(得分:0)

你可以这样做:

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

这会查找所有出现的\paragraph{,然后是0个或更多非{}个字符,然后是}(例如\paragraph{stuff here}),并将其替换为\item

或者,如果您要替换包含paragraph的所有行:

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