2016-06-30 92 views
3

在那里,我有一个包含像薮第一个TEX文件的所有整行:我如何使用vim替代匹配正则表达式是

\paragraph{name1} 

... 

\paragraph{name2} 

... 

现在我想替换所有的“段落”有项目,只像:

\item 
... 

\item 
... 

达到,我已经尝试了许多命令,最后我用这个: (请注意,我用“一”到“Z”的段落名称)

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

我认为这样既不美观也不高效。我试图匹配包含“段落”的行,但不知何故只有这个词被替换。现在,我可以删除所有这些行与

**:% g/_*paragraph_*/d** 

是反正有没有更好的执行以同样的方式替代?(或者说替代所有的行包含特定的词)

+1

所以'\ {段<什么位置>}'将被替换为唯一'\ item'?您的预期产出并不完全清楚。 –

+0

宏你还好吗?他们做同样的工作,没有使用复杂的正则表达式。 – SibiCoder

+0

@ Two-BitAlchemist准确地说,我想要的是:将所有包含“段落”的行全部替换为\ item(这是整行) –

回答

0

简单的方法处理macro! 首先,使用/来搜索模式,如​​

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

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

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

+0

这是一个好主意,我没有这样想过。但是我认为,如果有50多条这样的线路还需要很长时间? –

+0

它需要一两秒钟。你应该执行宏,你会爱上它们;) – SibiCoder

+1

哇,太神奇了! –

1

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

:% 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. 最后,我们将表达式锚定到行尾,并使用$,以便它不匹配完​​全不符合此模式的行。

+0

'[az | 0-9]'与'[a-z0- 9 |]':它匹配小写字母或数字或'|'。 – melpomene

+0

如果你的正则表达式像这样锚定,'/ g'没有什么区别。 – melpomene

+0

它的确适用于这种情况,谢谢。但我的问题是,如果我没有清楚地问清楚,如何替换一个更长和更复杂的行,其中包含一个特定的词,如“段落”在这里? –

0

你可以这样做:

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

此发现的\paragraph{所有出现,其次是0个或多个非{}字符,然后}(即类似\paragraph{stuff here}),并通过\item替换它们。


或者,如果你想更换含paragraph所有行:

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

它的工作原理比我的更好。但是,我仍然想知道如何用简短的方式来描述一条复杂的线。 –