我正在尝试使用带-s选项的vim来运行一个替换文件中某些行的脚本(text.txt):
test1
ab
ac
ae
test2
sd
脚本文件是这样的(脚本):
:silent %s/test1\zs\_.\+\zetest2/\=substitute(submatch(0), '\n\(\w\)', '\n#\1', 'g')/g
:wq
它注释掉test1和test2之间的界限。这就是我想要的。我不想要的是在提示之前和之后输出。我跑了然后得到:
user@hostname: ~/vimtest$ vim -s script text.txt
^[[?1;2cuser@hostname: ~/vimtest$ 1;2c
所以这个^[[?1;2c
已经是坏消息,但1;2c
在输入中就像我已经输入它一样。如果我点击输入它会给我一个bash错误。因此,每次使用脚本时我都必须删除这些符号。有什么想法吗?
答案 0 :(得分:2)
似乎vim
(或某些vim启动脚本)试图找出您正在使用的终端类型。 ^[[?1;2c
,在输入缓冲区中保留最后几个字符,几乎可以肯定是终端仿真器对DA(设备属性)查询的响应的一部分。您可以通过键入bash来自己看到:
printf '\033[c'
或者,要查看完整的返回,请暂停一下:
printf '\033[c'; sleep 0.1; echo
响应\033[?1;2c
表示“我是具有高级视频选项的VT100。”,这是xterm
和许多其他控制台程序响应的内容。 (Linux控制台本身响应\033[?6c
,这意味着“我是VT102。”
顺便说一下,只有1;2c
留在控制台输入缓冲区中的原因是初始转义码\033[?
在读取时被忽略了。 readline
库将忽略它而不回显它,而正常的控制台输入将回显它然后忽略它;这就是上面两个shell命令不同的原因。
我无法使用vim
安装重现此问题,因此我甚至不知道从哪里开始查找。但您可能会尝试查看禁用所有启动文件是否有帮助:
vim -u NONE -s script text.txt
如果有帮助,请逐个停用已安装的扩展程序,直至找到导致问题的扩展程序。
答案 1 :(得分:1)
:%s/test1\zs\_.\+\ze\ntest2/\=substitute(submatch(0), '\n', '\n#', 'g')/g
:wq
这是在这里测试的,它以所需的方式更改了输入文件。
根据您的命令进行了一些更改:
\n
\ze
\n
,我们不需要在\n
答案 2 :(得分:1)
我注意到你用bash
标记了问题,所以我认为也应该接受shell解决方案。
awk '/test1/{p=1;print;next}/test2/{p=0;print;next}{$0=(p?"#":"")$0}7' file
这个awk oneliner应该为你做到这一点。 vim是非常强大的编辑器,我喜欢vim。但是如果你想做一些自动转换,我更喜欢脚本或适当的文本处理工具。在Linux机器上,你总能找到一个。它更容易测试和调试。
使用您的输入进行测试:
kent$ cat f
test1
ab
ac
ae
test2
sd
kent$ awk '/test1/{p=1;print;next}/test2/{p=0;print;next}{$0=(p?"#":"")$0}7' f
test1
#ab
#ac
#ae
test2
sd
如果要将文本保存回文件,可以:
awk '...' file > tmp.file && mv tmp.file file