在Vim中加入某个文本模式之间的行


8

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

A.
text
text
text


A.
more text

more text

A.
more text

我想加入“标记”之间的所有行 A. 所以它看起来像:

A.texttexttext
A.more textmore text
A.more text

我怎么能在Vim中这样做?

Answers:


4
:%s/\n\(\(A\.$\)\@!.*\)/\1/

替换模式匹配:

  1. 新队,
  2. 一个包含的组

    1. 字符串 A. 然后直接跟着行尾
    2. 任何角色直到行尾

有:

  • 除了起始换行符(即上面的组)之外的所有内容都匹配,

并在全球范围内这样做


1
谢谢。我不知道那件事是如何运作的,但似乎!我将不得不仔细剖析它。我还找到了一个工作,加入所有的行,然后在“A”上插入一个新行。
vim noob

@vimnoob:见 :help \@! 在Vim中获取有关该部分的更多信息。否则,我的解释是直截了当的。您的方法存在问题,如果“ A. “发生在文本中,虽然不是作为一个孤立的标记线,它将被拆分,就像它最初是一个标记。在实践中它可能不是一个问题(我不知道你的”真实“文件是什么样的) ,但一般来说,如果不知道这一点,它可能会导致不必要的行为。
Daniel Andersson

@vimnoob:我再次阅读了我的答案,如果你不熟悉的话 :%s/// 语法:它是Vim中的“搜索和替换”语法。 : 启动命令, % 将整个缓冲区指定为范围, s 开始替换。 / 是模式分隔符(可以使用任何其他字符,但是 / 是“标准”)。首先 / 开始搜索模式,第二个是替换模式,第三个结束它。尾随修饰符可用于指定不区分大小写等。 \1 表示搜索模式中的抓取组。 :%s/foo/bar/ 取代 foobar 在文件中。
Daniel Andersson

非常感谢你的帮助。我只需要研究这个\ @!因为我熟悉基本的搜索替换和基本的正则表达式。
vim noob

1
@Reman:我立即想到的最直接的方式是运行后续的全局模式匹配 :%s/^A\.//。答案中的方法没有捕捉到 ^A\. 模式本身(而不是它们的缺席),所以它不能以明显的方式修改这些字符串。
Daniel Andersson

7

这也有效(当第一行开头时 A.

:v/^A/-1j!

这确实有效!尼斯。 +1
ZaSter

在全局反模式匹配(v)之后,对我来说,对我来说是新的,还有两个技巧:加入的'j'和'!'连接而不添加空格。谢谢。
fortboise

@Miro哇!先生,我向你致敬。如果你可以解释为什么它的工作然后超级!..我也不得不连接两者之间的标签字符行......所以我做的是在发行之前添加/ $ / \ t / g标签characterat每一行的结尾以上命令..任何更好的方法
ihightower
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.