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

3
我有一个包含多个段落的tex文件,例如:
\paragraph{name1}

...

\paragraph{name2}

...

现在我想把所有的“段落”都替换成“项目”,就像这样:

\item
...

\item
...

为了实现这一点,我尝试了许多命令,最终使用了这个: (请注意,我将“a:”到“z:”用作段落名称)
**:% s/\\paragraph[{][a-z]:[}]/\\item/g**

我认为这既不美观也不高效。我试图匹配包含“段落”一词的行,但只有这个词被替换了。现在我可以使用

删除所有这样的行。
**:% g/_*paragraph_*/d**

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

1
那么\paragraph{<任何内容>}会被替换为仅有的\item吗?你期望的输出对我来说不是很清楚。 - Two-Bit Alchemist
你对宏感到满意吗?它们可以完成相同的工作,而无需使用复杂的正则表达式。 - SibiCoder
@Two-BitAlchemist 没错,我想要的是:用\item替换所有包含“paragraph”的行(整行替换)。 - Ruiheng Wu
3个回答

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.最后,我们使用“$”将表达式锚定到行的末尾,这样就不会匹配不完全符合此模式的行。

[a-z|0-9][a-z0-9|] 是相同的:它匹配小写字母、数字或 | - melpomene
如果您的正则表达式是这样锚定的,/g 将没有任何区别。 - melpomene
这种情况下确实有效,谢谢。但我的问题是,如果我没有表达清楚,如何替换包含特定词汇(例如“段落”)的更长、更复杂的行? - Ruiheng Wu

1

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

让我们开始录制宏。通过按下qaq清除寄存器a。 按下qa开始在寄存器a中记录。 按下n跳转到其出现位置。然后,按下c$删除直到行末并插入文本。然后,键入文本,然后按下escape键。

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

现在,宏已经被记录,您可以按下@a一次以更改所有这些行中的内容。


这是个好主意,我没想到过这种方法。但是如果有超过50行的话,可能还是需要花费很长时间吧? - Ruiheng Wu
只需要一两秒钟。你应该执行宏,你会爱上它们的 ;) - SibiCoder

0
你可以这样做:
:%s/\\paragraph{[^{}]*}/\\item/g

这个程序会查找所有出现的\paragraph{,后面跟着0个或多个非{}字符,然后是}(例如\paragraph{这里有一些内容}),并将它们替换为\item


或者如果您想替换所有包含段落的行:

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

它能够正常工作,而且比我的更好。但是,我仍然想找出如何用简短的方式描述复杂的代码行。 - Ruiheng Wu

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接