免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2862 | 回复: 8
打印 上一主题 下一主题

[系统管理] vi如何取得外部命令执行的结果? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2014-09-05 17:05 |只看该作者 |倒序浏览
在vi中,我通过w|! wc来统计当前正在vi中编辑的文档的信息,我想将执行结果也保存到当前的vi文档中,不知如何操作?有高手能指点一下吗?

论坛徽章:
9
射手座
日期:2014-07-29 13:05:07双子座
日期:2015-01-11 17:01:522015年亚洲杯之朝鲜
日期:2015-02-01 16:14:282015亚冠之阿尔艾因
日期:2015-06-04 17:54:40数据库技术版块每日发帖之星
日期:2015-08-02 06:20:00数据库技术版块每日发帖之星
日期:2015-10-28 06:20:00数据库技术版块每日发帖之星
日期:2015-11-26 06:20:0015-16赛季CBA联赛之天津
日期:2016-06-20 17:09:2015-16赛季CBA联赛之青岛
日期:2017-02-26 15:54:19
2 [报告]
发表于 2014-09-05 22:54 |只看该作者
  1. :r!command  
  2. 将command的stin追加到文件末
复制代码

论坛徽章:
0
3 [报告]
发表于 2014-09-07 17:16 |只看该作者
回复 2# stupid_lee
这种做法不对,我还是举例来讲一下。假设我的vi中的文档内容为(其文件名为test.txt):
hello word
然后在vi中我执行:w|!wc  %,这时会得到如下结果:
1 2 12 test.txt
我想将这个结果自动插入到现在的文档(文件名为test.txt)中。不知该如何操作?
   

论坛徽章:
9
射手座
日期:2014-07-29 13:05:07双子座
日期:2015-01-11 17:01:522015年亚洲杯之朝鲜
日期:2015-02-01 16:14:282015亚冠之阿尔艾因
日期:2015-06-04 17:54:40数据库技术版块每日发帖之星
日期:2015-08-02 06:20:00数据库技术版块每日发帖之星
日期:2015-10-28 06:20:00数据库技术版块每日发帖之星
日期:2015-11-26 06:20:0015-16赛季CBA联赛之天津
日期:2016-06-20 17:09:2015-16赛季CBA联赛之青岛
日期:2017-02-26 15:54:19
4 [报告]
发表于 2014-09-07 19:50 |只看该作者
回复 3# flyinsky518

vi中我是搞不定了,不过shell中可以这样




    wc -lmc test.txt >>test.txt

论坛徽章:
0
5 [报告]
发表于 2014-09-08 07:44 |只看该作者
回复 4# stupid_lee

谢谢!shell我也能搞定。
   

论坛徽章:
224
2022北京冬奥会纪念版徽章
日期:2015-08-10 16:30:32操作系统版块每日发帖之星
日期:2016-02-18 06:20:00操作系统版块每日发帖之星
日期:2016-03-01 06:20:00操作系统版块每日发帖之星
日期:2016-03-02 06:20:0015-16赛季CBA联赛之上海
日期:2019-09-20 12:29:3219周年集字徽章-周
日期:2019-10-01 20:47:4815-16赛季CBA联赛之八一
日期:2020-10-23 18:30:5320周年集字徽章-20	
日期:2020-10-28 14:14:2615-16赛季CBA联赛之广夏
日期:2023-02-25 16:26:26CU十四周年纪念徽章
日期:2023-04-13 12:23:1015-16赛季CBA联赛之四川
日期:2023-07-25 16:53:45操作系统版块每日发帖之星
日期:2016-05-10 19:22:58
6 [报告]
发表于 2014-09-08 11:26 |只看该作者
感觉vi还是不够高大上啊

看了各位牛人的想法后

论坛徽章:
26
CU大牛徽章
日期:2013-03-13 15:15:08水瓶座
日期:2014-08-31 19:44:01卯兔
日期:2014-09-05 08:48:33摩羯座
日期:2014-09-07 13:03:35子鼠
日期:2014-09-10 08:42:36白羊座
日期:2014-09-20 12:39:07丑牛
日期:2014-09-24 07:35:252015年亚洲杯之阿联酋
日期:2015-02-03 17:42:542015年亚洲杯之卡塔尔
日期:2015-02-11 13:13:022015年亚洲杯之约旦
日期:2015-03-03 15:10:522015年辞旧岁徽章
日期:2015-03-03 16:54:152015年亚洲杯之卡塔尔
日期:2015-03-27 14:08:09
7 [报告]
发表于 2014-09-08 12:55 |只看该作者
本帖最后由 Third-Edition 于 2014-09-08 13:58 编辑

可以将wc的运行结果存放到寄存器中 , 再将寄存器的内容写入文件
:let @a=system("wc /tmp/foo.txt")
"ap

vim的g_ctrl-g可以查看当前缓冲区详细的统计信息, 不知道对应的函数是啥, 这样就不用system了. 查手册无结果 谁知道?

  1. function Wc()
  2.     let lines=0
  3.     let bytes=0
  4.     let words=0
  5.     for line in getbufline(bufname("%"),1,"$")
  6.         let lines = lines +1
  7.         let bytes = bytes + strlen(line)
  8.         let lst = split(line)
  9.         let words = words + len(lst)
  10.     endfor
  11.     return getfsize(bufname("%")) . " " . words . " " . lines
  12. endfunction
复制代码
上面的vim脚本可能可以用 我觉得. 由于line获取到的行是不包括\n或\r\n或\r的. 所以在统计字节数时我用getfsize获取文件大小来代替. 这会不会有统计不准问题? bufname("%")获取的是当前缓冲区的名字, 一般缓冲区名跟文件名一样.
然后就可以.
:let @a=Wc()
"ap

论坛徽章:
0
8 [报告]
发表于 2014-09-10 13:00 |只看该作者
回复 7# Third-Edition


    感谢你的回复,我试试看。

论坛徽章:
26
CU大牛徽章
日期:2013-03-13 15:15:08水瓶座
日期:2014-08-31 19:44:01卯兔
日期:2014-09-05 08:48:33摩羯座
日期:2014-09-07 13:03:35子鼠
日期:2014-09-10 08:42:36白羊座
日期:2014-09-20 12:39:07丑牛
日期:2014-09-24 07:35:252015年亚洲杯之阿联酋
日期:2015-02-03 17:42:542015年亚洲杯之卡塔尔
日期:2015-02-11 13:13:022015年亚洲杯之约旦
日期:2015-03-03 15:10:522015年辞旧岁徽章
日期:2015-03-03 16:54:152015年亚洲杯之卡塔尔
日期:2015-03-27 14:08:09
9 [报告]
发表于 2014-09-10 14:29 |只看该作者
本帖最后由 Third-Edition 于 2014-09-10 14:36 编辑

回复 7# Third-Edition

  1. function Wc()
  2.     let lines=0
  3.     let bytes=0
  4.     let words=0
  5.     for line in getbufline(bufname("%"),1,"$")
  6.         let lines = lines +1
  7.         let lst = split(line)
  8.         let words = words + len(lst)
  9.     endfor
  10.     let bytes = line2byte(line("$")+1) - 1

  11.     let wc =   bytes . " " . words . " " . lines
  12.     call append(line("$"),wc)
  13. endfunction


复制代码
我已经完美解决了, 看上面代码. line("$")+1表示 "最后一行+1的行" line2byte是获取当前行之前的所有字节数包括换行符. 所以line2byte(line("$")+1)计算出的缓冲区大小会多出一个字节需要减去1.
call append(line("$"),wc) append在指定行位置后面追加若干行. line("$")是最后一行. 所以就是在最后一行追加一行 行的内容是:"字节数 单词数 行数"
现在只需要:call Wc()即可
或者将这个代码放入.vimrc中, 然后做映射 nmap gG :call Wc()^M 这样在nomal模式下输入gG就会在文件末尾追加了.
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP