使每条线都Vim

ehxuflar  于 2023-11-19  发布在  其他
关注(0)|答案(4)|浏览(110)

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

file1
file2
file3
.
.
.
filen

字符串
我想把它转换成:

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


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

evrscar2

evrscar21#

试试这个:

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

字符串

  • 说明:*

:%s/a/b/g表示搜索整个文件并将a替换为b
.*表示匹配一行中的所有内容。
\0表示匹配的东西。
\r表示新行。

vptzau2j

vptzau2j2#

或者你可以应用一个宏

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运行三十次。

j8ag8udp

j8ag8udp3#

我通常会接受公认的答案,但只是为了表明命令模式(Ex)命令也可以很好:
:g/^./t. | norm!icat␣ ^O k ^O 0echo␣" ^OA "
注:使用^V输入键码(例如^V^O)。在Windows上,^Q默认具有该功能)
解释

  • :g/^./(对至少包含一个字符的每一行重复)
  • t.(重复下面的行)
  • 其余的:
  • 插入“猫",
  • ^O k(向上一行)
  • ^O 0(在行的开头)
  • 插入'echo "'
  • 在行尾追加'"'
uubf1zoe

uubf1zoe4#

@ xdom的答案的一个变体。你只能使用Vim的正则表达式:

:%s/\(.*\)/\1\r\1

字符串

  • \(.*\)将整行添加到\1寄存器
  • \1\r\1重复行,中间有一个换行符

相关问题