使每一行双倍vim

问题描述 投票:0回答:4

我有一个如下所示的文件:

file1
file2
file3
.
.
.
filen

我想将其转换为:

echo "file1"
cat file1
echo "file2"
cat file2
.
.
.
.
echo "filen"
cat filen

一种方法是使用 for 循环并读取原始文件的内容并将修改后的内容写入另一个文件,我这样做了并且成功了。是否有任何命令可以在

vim
:g
或任何其他命令中执行相同的操作?

shell vim vi
4个回答
8
投票

试试这个:

:%s/.*/echo "\0"\rcat \0/g

说明:

:%s/a/b/g
表示搜索整个文件并将
a
替换为
b

.*
表示匹配一行中的所有内容。

\0
表示匹配的东西。

\r
表示新行。


3
投票

或者你可以应用宏

yypha"<esc>^iecho "<esc>j^icat <esc>j
  • yypha"
    拉动当前行并将其置于当前行下方并使用
    h
  • 向上移动
  • a"<esc>
    附加
    "
    并返回正常模式
  • ^iecho "<esc>
    echo "
    放在
    file*
    前面,然后再次恢复正常
  • j^icat<esc>
    在下一行添加 cat 并
  • j
    最后转到下一行,准备重新应用宏

您可以通过按

qq
和所述按钮来录制宏,或者

写入

yypha"^[^iecho "^[j^icat ^[j
,其中
^[
输入为
Ctrl-V
,然后是
Esc
,然后是
"qyy
,以拉出第 q 个寄存器中的行,这也是一个可执行宏。

宏本身可以使用

@q
运行一次或
30@q
三十次。


1
投票

我通常会选择接受的答案,但只是为了表明命令模式(Ex)命令也可以很好:

:g/^./t. | norm!
icat␣
^O
k
^O
0echo␣"
^OA
"

注意:使用 ^V 输入键码(例如 ^V^O)。在 Windows 上,^Q 默认具有该功能)

说明

  • :g/^./
    (对包含至少一个字符的每一行重复)
  • t.
    (复制下面的行)
  • 其余:

    • 插入“猫”,
    • ^O
      k
      (上一行)
    • ^O
      0
      (在行首)
    • 插入
      'echo "'
    • 在行尾附加
      '"'

0
投票

@xdazz 的答案的变体。你只能使用 Vim 的正则表达式来做到这一点:

:%s/\(.*\)/\1\r\1
  • \(.*\)
    将整行添加到
    \1
    寄存器
  • \1\r\1
    复制该行并在其间添加换行符
© www.soinside.com 2019 - 2024. All rights reserved.