我有一个文件,看起来像这样:
file1 file2 file3 . . . filen
字符串我想把它转换成:
echo "file1" cat file1 echo "file2" cat file2 . . . . echo "filen" cat filen
型一种方法是使用一个for循环,读取原始文件的内容,并将修改后的内容写入另一个文件,我这样做了,它工作了。在vim到:g或任何其他命令中是否有任何命令可以做同样的事情?
vim
:g
evrscar21#
试试这个:
:%s/.*/echo "\0"\rcat \0/g
字符串
:%s/a/b/g表示搜索整个文件并将a替换为b。.*表示匹配一行中的所有内容。\0表示匹配的东西。\r表示新行。
:%s/a/b/g
a
b
.*
\0
\r
vptzau2j2#
或者你可以应用一个宏
yypha"<esc>^iecho "<esc>j^icat <esc>j
yypha"
h
a"<esc>
"
^iecho "<esc>
echo "
file*
j^icat<esc>
j
你可以通过按下qq和所描述的按钮来录制宏,写入yypha"^[^iecho "^[j^icat ^[j,**^[**输入为Ctrl-V,然后是Esc,然后是"qyy,以在第q个寄存器中提取该行,然后它也是一个可执行宏。宏本身可以用@q运行一次或30@q运行三十次。
qq
yypha"^[^iecho "^[j^icat ^[j
^[
Ctrl-V
Esc
"qyy
@q
30@q
j8ag8udp3#
我通常会接受公认的答案,但只是为了表明命令模式(Ex)命令也可以很好::g/^./t. | norm!icat␣ ^O k ^O 0echo␣" ^OA "注:使用^V输入键码(例如^V^O)。在Windows上,^Q默认具有该功能)解释
:g/^./t. | norm!
icat␣
k
0echo␣"
:g/^./
t.
0
'echo "'
'"'
uubf1zoe4#
@ xdom的答案的一个变体。你只能使用Vim的正则表达式:
:%s/\(.*\)/\1\r\1
\(.*\)
\1
\1\r\1
4条答案
按热度按时间evrscar21#
试试这个:
字符串
:%s/a/b/g
表示搜索整个文件并将a
替换为b
。.*
表示匹配一行中的所有内容。\0
表示匹配的东西。\r
表示新行。vptzau2j2#
或者你可以应用一个宏
字符串
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
运行三十次。j8ag8udp3#
我通常会接受公认的答案,但只是为了表明命令模式(Ex)命令也可以很好:
:g/^./t. | norm!
icat␣
^Ok
^O0echo␣"
^OA"
注:使用^V输入键码(例如^V^O)。在Windows上,^Q默认具有该功能)
解释
:g/^./
(对至少包含一个字符的每一行重复)t.
(重复下面的行)k
(向上一行)0
(在行的开头)'echo "'
'"'
uubf1zoe4#
@ xdom的答案的一个变体。你只能使用Vim的正则表达式:
字符串
\(.*\)
将整行添加到\1
寄存器\1\r\1
重复行,中间有一个换行符