Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/vim/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Shell 使每一条线双倍于vim_Shell_Vim_Vi - Fatal编程技术网

Shell 使每一条线双倍于vim

Shell 使每一条线双倍于vim,shell,vim,vi,Shell,Vim,Vi,我有一个如下所示的文件: file1 文件2 文件3 . . . 菲林 我想将其转换为: echo“file1” cat文件1 回显“文件2” cat文件2 . . . . 回声“文件” 猫锉 一种方法是使用for循环,读取原始文件的内容,然后将修改后的内容写入另一个文件,我这样做了,它成功了。在vim到:g或任何其他命令中是否有任何命令可以执行相同的操作?尝试以下操作: :%s/.*/echo "\0"\rcat \0/g 说明: :%s/a/b/g表示搜索整个文件并将a替换为b *表示

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

file1
文件2
文件3
.
.
.
菲林
我想将其转换为:

echo“file1”
cat文件1
回显“文件2”
cat文件2
.
.
.
.
回声“文件”
猫锉
一种方法是使用for循环,读取原始文件的内容,然后将修改后的内容写入另一个文件,我这样做了,它成功了。在
vim
:g
或任何其他命令中是否有任何命令可以执行相同的操作?

尝试以下操作:

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

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

*
表示在一行中匹配所有内容

\0
表示匹配的对象


\r
表示新行。

或者,您可以应用宏

yypha"<esc>^iecho "<esc>j^icat <esc>j
yypha“^iecho”j^icat j
  • yypha“
    猛拉当前行,将其置于当前行下方,然后随着
    h
  • a“
    追加一个
    并返回正常模式
  • ^iecho”
    echo“
    放在
    文件*
    前面,然后再次恢复正常
  • j^icat
    在下一行中预先添加cat,然后
  • j
    最后转到下一行,准备重新应用宏
您可以按
qq
和所述按钮录制宏,或

写入
yypha“^[^iecho”^[j^icat^[j
,将
^[/code>输入为
Ctrl-V
,然后
Esc
,然后
“qyy
将第q个寄存器中的行拉出,这也是一个可执行宏


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

我通常会同意接受的答案,但只是为了说明命令模式(Ex)命令也很好:

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

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

解释

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

    • 插入“cat”
    • ^O
      k
      (向上一行)
    • ^O
      0
      (在行首)
    • 插入
      “echo”
    • 在行尾追加

太棒了……世界上有什么事情是vim做不到的:)……如果你能解释一下它是如何工作的,那就太好了。。thanks@nav_jan:它不洗碗。这是Emacs的事。@xdazz为什么要更改答案
:%s/\(.*)/echo“\1”\rcat\1/g
对我来说非常有效?@nav_jan因为这一个同样有效,但更短,请检查我的编辑。@vim
\r
中的fork0是新行。是的,没有解释宏很难获得。但最酷的是宏存储在寄存器中(这里是q)因此,您可以粘贴和编辑它并将其拉回到寄存器中-因此,键入错误的宏不是重新录制宏的理由。如何查看寄存器的内容?您可以键入
:reg
,或者仅将其粘贴到空文件中,例如使用
“qp
(粘贴寄存器q)为什么在
0
之前需要
^O
,而在
A
之前不需要呢?@sg-lecram-Oops。不知怎的,这件事出了岔子。谢谢提醒,我已经解决了