使每一行双vim

时间:2012-07-06 10:20:45

标签: shell vim vi

我有一个看起来像这样的文件:

file1
file2
file3
.
.
.
filen

我想将其转换为:

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

一种方法是使用for循环并读取原始文件的内容并将修改后的内容写入另一个文件,我这样做并且它有效。是否有任何命令在vim:g或任何其他命令中执行相同操作?

3 个答案:

答案 0 :(得分:8)

试试这个:

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

说明:

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

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

\0表示匹配的内容。

\r表示新行。

答案 1 :(得分: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写为{strong> ^[ ,然后输入Ctrl-V,然后Esc,然后"qyy来排除q中的行-th register,也是一个可执行的宏。

宏本身可以使用@q一次或30@q三十次运行。

答案 2 :(得分:1)

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

  

:g/^./t. | norm! icat␣ ^ O k ^ O 0echo␣" ^ O < / KBD> A "

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

解释

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

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