如何在vi中合并两行?

185

我有一个文本文件中的两行内容如下:

S<Switch_ID>_F<File type>
_ID<ID number>_T<date+time>_O<Original File name>.DAT
我想在vi中像下面这样拼接两行:
S<Switch_ID>_F<File type>_ID<ID number>_T<date+time>_O<Original File name>.DAT

使用vi的命令模式,如何将第二行删除并将第二行的内容追加到第一行?


无关的问题:为什么我们需要连接两行? - Rishabh Bhatnagar
@RishabhBhatnagar,因为我们需要将它们连接起来。 - Vijay
由于 J 键非常容易到达,因此连接操作必须是最常用的操作之一。我只想知道连接操作需要使用的用例。 - Rishabh Bhatnagar
在广泛使用vim之后,我意识到为什么要使用join。在编码时,它非常常用于合并注释行、参数列表或情况,当您想要合并表达式时,例如:if err != nil { return err }合并成 return err }``` - Rishabh Bhatnagar
9个回答

342

Shift+J 可以去除当前行的换行符,在任意位置按下 "J" 键,就可以按照你想要的方式将当前行和下一行组合在一起。


33
“将当前行的换行符移除”是一个相当拙劣的方式来描述 J 命令的操作,而且也不完全正确。J 命令会将当前行和下一行“连接”起来,并在此过程中删除换行符,同时还会以其他方式处理空格。 - Laurence Gonsalves

64

Vi还是Vim?

无论如何,在“nocompatible”模式下,以下命令适用于Vim。也就是说,我想几乎等同于纯vi。

:join!

如果你想从普通命令中执行此操作,请使用:

gJ

使用'gJ'命令可以将行连接起来,不会添加或删除任何空格:

S<Switch_ID>_F<File type>
_ID<ID number>_T<date+time>_O<Original File name>.DAT

结果:

S<Switch_ID>_F<File type>_ID<ID number>_T<date+time>_O<Original File name>.DAT

'J' 命令将会使你:

S<Switch_ID>_F<File type> _ID<ID number>_T<date+time>_O<Original File name>.DAT

注意type>_ID之间的空格。


2
只是想指出,在VIM中,g/pattern/join是有效的,而g/pattern/J则不行。这可能会帮助一些未来的人。 - jisaacstone
我喜欢你的join with pattern,但是它用空格连接了两行。有没有办法用模式连接两行而不带空格? - David.Chu.ca
g/pattern/join! 似乎可以做到这一点。 - fortboise
如果下一行开头有空格,gJ 会保留这些空格,而 J 看起来只会放置一个空格字符,无论下一行开头有多少个空格。 - userrandrand

26
这应该就可以了:

这应该就可以了:

J


6
“J”命令在连接行时会提供额外的空格。 - Maxim Kim
4
这就是为什么要使用句子间距。请注意,:h J会告诉你如何禁用该特性。 - ereOn
2
如果您不希望Vim在连接行时添加空格,请使用“gJ”。 - qwertzguy

22

在 vi 中,J (即 Shift + J) 或 :join 命令通常可以实现你想要的结果。需要注意的是它们会调整空格。尤其是在许多情况下,两个合并的行之间会有一个空格,在第二行缩进的情况下,缩进将被移除后再进行合并。

在 Vim 中,你还可以使用 gJ(按下 G 键,然后再按下 Shift + J 键)或 :join! 命令来连接行,而不进行任何空格调整。

在 Vim 中,查看 :help J 获取更多信息。


使用 gJJ 的一个注意事项是,它们都会将光标更改为连接点,但 :join!:join 不会。 - SergioAraujo

5

只需将 "\n" 替换为 ""。

在 vi/Vim 中,对于文档中的每一行:

%s/>\n_/>_/g

如果你想要确认每一次替换:

%s/>\n_/>_/gc

3

如果你想加入选定的行(处于可视模式下),只需按 gJ 键即可将行连接起来,不留任何空格。

详细说明请参见 Vi/Vim Stack Exchange 网站


1

另一种不需要将光标放到该行的方法是连接两行:

:6,6s#\n##

这里的数字6是另一行将要加入的行号。要显示行号,请使用:set nu命令。

如果我们在光标所在位置,需要将下一行加入到该位置,则执行以下操作:

:s#\n##

在这两种情况下,我们不需要像 :s#\n##g 一样使用 g,因为每行只有一个 \n

使用 Shift+V 更容易选择要合并的所有行,除了最后一行,然后在此示例中使用 :'<,'>s/\n/, / 合并行并在每行末尾放置逗号和空格。请注意,当选定某些内容并在正常模式下键入 : 时,'<,'> 会自动出现在命令行上。 - Evgeni Sergeev
适用于选择多行并使用首选分隔符连接的情况。发现一个拼写错误...在正常模式还是可视化模式下? - vusan

1

在第一行按下 Shift + 4("$"),然后按下 Shift + j ("J")。

如果需要帮助,请进入vi,然后按下F1


4
$ 移动到行末,但 J 不需要移动。 - user25148
2
您不必在J加入行的末尾。 - Jonathan Leffler
2
按下 $ 其实并不必要。 - Laurence Gonsalves
1
@laurence .pressing $ 确保光标位于新行字符旁边,这是必须的。 - Vijay
@Vijay:这不是必须的(至少在Vim 8.1.2269中不是)。无论哪种方式,您都会得到额外的空格。(vi/Vim的配置是否起作用?)使用gJ可以避免额外的空格。你试过吗? - Peter Mortensen
"Shift + 4"仅适用于美国键盘布局。 - Peter Mortensen

1
在Vim中,你也可以使用gJ

ََ


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