关于尚观
最新课程体系
企业服务
零起点咨询
开放课程
报名咨询
免费资源申请
Oracle服务
学员专区&薪资
认证课程
  • 尚观首页
  • 尚观简介
  • 师资力量
  • 尚观文化
  • 尚观动态
  • 加入尚观
  • 联系我们
  • 珍贵瞬间
  • 院校合作
  • Linux系统与集群
  • 数据库集群架构师
  • 嵌入式内核驱动开发
  • 服务器开发架构师
  • Android开发架构师
  • RHCE/LPI认证体系
  • Oracle OCP认证
  • 企业高级技术培训
  • 批量人才供应及研发团队建设
  • 软件外包及研发项目合作
  • 人力外包及人力供应
  • 猎头服务
  • 开启职业生涯
  • 如何入门
  • Unix/Linux职业方向
  • 嵌入式职业方向
  • 集群(Cluster)Oracle(DBA)方向
  • 新手专栏
  • Android开发方向
  • Unix/Linux新手专栏
  • Unix/Linux管理
  • 嵌入式及POSIX开发
  • Linux开源文化及市场
  • 最近网络课堂
  • P2P教学视频
  • 精彩Linux培训视频
  • 零起点数据库集群(长期)
  • 嵌入式驱动(长期)
  • Linux金牌三证(RHCE级)
  • Linux架构师(RHCA级)
  • 嵌入式/驱动加速课程
  • Linux免费网络安全公开课
  • 免费Linux资料申请
  • 免费Linux安全&DDOS防御课程
  • 免费嵌入式Linux开发课程
  • 免费Linux网络安全机制
  • 尚观服务
  • 软件产品
  • 技术方案
  • 尚观支持
  • 学员毕业薪资(不断更新中)
  • 加入尚观猎头服务(仅限老学员)
  • OCP认证
  • Intel认证
  • RHCE认证
  • RHCE+OCP
  • RHCE+LPI
  • OCM认证
  • RHCA认证


    您现在的位置:尚观Linux培训 - 嵌入式Linux培训专家尚观Linux培训 » UNIX/Linux新手专栏 » VI高级命令集锦及VIM应用实例(二)

 
 
咨询热线
  • 免费咨询电话:
    400-700-0056
    800-810-0056

    教学就业监督电话:
    400-810-3016



  • 在线咨询
免费资源
  • [北京]Linux安全-4月24日
  • [沈阳]Linux嵌入式-4月24日
  • [上海]DDos攻防-4月24日
  • [上海]Linux嵌入式-4月24日
  • [深圳]DDos攻防-4月24日
  • [深圳]Linux嵌入式-4月24日
  • [北京]DDos攻防-4月24日
  • 就业课程
  • 免费课程
  • 五万年薪就业保证课程

  • ULP-S 尚观王者IT集群课程 v8.2版
  • UEA嵌入式内核驱动开发者 V8.2版
  • UGA-Android开发架构师 V3.2版
  • ULA-linux云存储集群架构师V8.2版
  • UOA-Oracle集群架构师课程V8.2版
  • 八万年薪就业保证课程

  • OCM10g-Oracle顶级数据库大师级
  • UEM-嵌入式开发大师
  • 纯免费!技术达人讲解Android系统通信互动程序开发! 5月24日
  • 纯免费! Shrek主讲Linux网络攻击及安全! 5月17日
  • 纯免费! 大牛讲解如何在开发板上构建Linux系统 5月10日
  • 纯免费! 尚观OCM大师主讲Oracle实时备份课程 4月26日
  • 纯免费! Shrek主讲Linux网络攻击及安全课程 4月11日
  • 纯免费!Foway为您解析OCM考试经验 3月2日
  • 纯免费!shrek主讲 linux网络攻击及安全课程 2月8日
  • 纯免费!连续3天,Android开发入门实战免费公开课 12月27日
  • 纯免费!“云”指南“嵌入式”指北大型讲座! 12月24日
Linux培训●最新开班
  • [北京]UGA课程5月班热招!
  • [北京]UEA课程5月班热报!
  • [北京]ULP-S课程5月班热招
  • [上海]UEA课程5月班热招!
  • [上海]ULP-S课程5月班热招
  • [上海]UGA课程5月班热招!
  • [深圳]ULP-S课程5月班热招
  • [深圳]UEA课程5月班热招!
 
VI高级命令集锦及VIM应用实例(二)
  • 首先将第一行置为当前行,然后执行map命令,将一大串VIM指令映像给字符=。这一大串VIM指令共分9步执行:


    ma 将数据文件一的第一行标记为a
    1-----
    2-----
    3-----
    !!!!!!!!!!!!!!!!!!!!!!!!
    |--------1---------2---------3---------4---------5
    1=====
    2=====
    3=====


    /!!!!!^M 找到标志行,置为当前行
    1-----
    2-----
    3-----
    !!!!!!!!!!!!!!!!!!!!!!!!
    |--------1---------2---------3---------4---------5
    1=====
    2=====
    3=====


    + 光标下移一行,即把标尺行置为当前行
    1-----
    2-----
    3-----
    !!!!!!!!!!!!!!!!!!!!!!!!
    |--------1---------2---------3---------4---------5
    1=====
    2=====
    3=====


    :.co 'a-1^M 把标尺行复制到标记行(数据文件一的第一行)的上方
    |--------1---------2---------3---------4---------5
    1-----
    2-----
    3-----
    !!!!!!!!!!!!!!!!!!!!!!!!
    |--------1---------2---------3---------4---------5
    1=====
    2=====
    3=====


    /!!!!!^M 再次找到标志行,置为当前行
    |--------1---------2---------3---------4---------5
    1-----
    2-----
    3-----
    !!!!!!!!!!!!!!!!!!!!!!!!
    |--------1---------2---------3---------4---------5
    1=====
    2=====
    3=====


    2+ 光标下移2行,即数据文件二的第一行置为当前行
    |--------1---------2---------3---------4---------5
    1-----
    2-----
    3-----
    !!!!!!!!!!!!!!!!!!!!!!!!
    |--------1---------2---------3---------4---------5
    1=====
    2=====
    3=====


    :.m'a^M 把数据文件二的第一行移至标记行的下方
    |--------1---------2---------3---------4---------5
    1-----
    1=====
    2-----
    3-----
    !!!!!!!!!!!!!!!!!!!!!!!!
    |--------1---------2---------3---------4---------5
    2=====
    3=====


    + 光标下移一行,即数据文件一的第二行置为当前行
    |--------1---------2---------3---------4---------5
    1-----
    1=====
    2-----
    3-----
    !!!!!!!!!!!!!!!!!!!!!!!!
    |--------1---------2---------3---------4---------5
    2=====
    3=====


    = 这一步很关键,是典型的递归调用,重复完成以上步骤


    例四、在文件中置入行号


    工作中,我们有时希望把行号置入文件中,而VIM提供的功能 :set nu 只能显示行号,不能编辑或将其置入文件当中,下面的宏命令脚本row_num.vim可以完成此项功能。

    "------------------------------------------
    "Macro Function : Source File Add Row_Num
    " Date : 2001/12/01
    " Author : Yan Shi
    "------------------------------------------
    :%s/^/^I/
    :$
    :let end=line(".")
    :1
    "------------------------------------------
    :let num=1
    :while num<=end
    :let line=getline(".")
    :let temp=substitute(line,$,num,"")
    :call setline(".",temp)
    :+
    :let num=num+1
    :endwhile
    "------------------------------------------

    请注意:本例中的^I表示键盘上的TAB键,并非^和I两个字符。下面,我针对该宏命令脚本逐一讲解。

    :%s/^/^I/ 每一行的行首添加一个TAB字符
    :$ 到文件的末行
    :let end=line(".") 末行的行号 ==〉变量 END,函数line的功能是取得指定行的行号,此处参数"."表示当前行
    :1 到文件的首行
    "------------------------------------------
    :let num=1 1 ==〉计数器
    :while num<=end
    :let line=getline(".") 取当前行的内容 ==〉变量 LINE
    :let line=substitute(line,$,num,"") 在变量 LINE 的前面置入行号
    :call setline(".",line) 将变量 LINE 的内容写回当前行
    :+ 下移一行
    :let num=num+1 计数器加一
    :endwhile 循环执行,直到文件结束
    "------------------------------------------

    有关正则表达式的使用


    UNIX/LINUX下的很多工具之所以强大、灵活,关键是因为有了正则文法和元字符,这也是VIM乃至UNIX/LINUX系统的精华所在。正因为使用灵活,因此掌握起来比较吃力,如果不是真正理解,实际运用中会出现千奇百怪的错误。因此,有必要对这部分知识多花些气力。下面结合具体实例讲解。


    例五、有一文件,包含某外企的中国员工的资料,首先是姓名,然后是两个空格,其次是15位身份证号码。


    zhang.fei 430759701022003
    diao.chan 651302801225012
    guan.yu 342869680413001
    xi.shi 120638780214006
    liu.bei 210324650708001

    现在,有以下问题需要解决:

    按照外国人的习惯,应该是名在前,姓在后。因此,文件中的姓名字段需要修改。
    姓与名的首字母应该大写。
    根据身份证号码,还可以判断出生年月日,将其作为一个新字段添加。
    根据身份证号码,可以判断出性别。若为男性,添加male,若为女性,添加female 。
    将男女员工分开,男员工在前,女员工在后。
    将各字段数据左对齐

    最终结果如下:
    Fei.Zhang 430759701022003 1970/10/22 male
    Yu.Guan 342869680413001 1968/04/13 male
    Bei.Liu 210324650708001 1965/07/08 male
    -----------------------------------------------
    Chan.Diao 651302801225012 1980/12/25 female
    Shi.Xi 120638780214006 1978/02/14 female

    为了完成上述功能,只需执行脚本employee.vim ,使用方法为 :so employee.vim 回车即可。

    脚本内容如下:

    :%s/ / /
    :%s/\\(............\\)\\( *\\)/\\1/
    :%s/\\([A-Za-z][A-Za-z]*\\)\\(\\.\\)\\([A-Za-z][A-Za-z]*\\)/\\u\\3\\2\\u\\1/
    :%s/$/ xxxxxx/
    :%s/\\([0-9]\\{6}\\)\\([0-9]\\{6}\\)\\([0-9]\\{3}\\) \\(xxxxxx\\)/\\1\\2\\3 \\2/
    :%s/\\(..\\)\\(..\\)\\(..\\)$/19\\1\\/\\2\\/\\3
    :%s/$/ xxxxxx/
    :%s/\\([0-9]\\{14}[13579]\\)\\(.*\\)\\(xxxxxx\\)/\\1\\2male /
    :%s/\\([0-9]\\{14}[02468]\\)\\(.*\\)\\(xxxxxx\\)/\\1\\2female/
    :$
    :s/.*/&^M-----------------------------------------------
    :g/female/.m$

    在这个脚本中,使用了大量的正则表达式,这里仅对涉及到的正则表达式做一简要介绍。有关正则表达式的内容相当多,本文不可能占用大量篇幅叙述,请大家谅解。

    % 地址范围符号,代表文件中的所有行,作用等同于地址范围 1,$
    . 与任意单字符(换行符除外)匹配,例如 y.s 可以匹配 yas y.s 或 y s 等等。
    * 与前一字符的0次或多次出现匹配,例如 y*s 可以匹配 yys yyyyys 或 s 等等。
    $ 与行尾匹配。
    & 代表模式匹配中出现的字符串,例如 s/abc/&def 是把当前行的abc替换成abcdef 。
    [] 匹配[]中出现的字符,例如[abc]匹配字符 a,b 或 c ,[a-zA-Z]匹配所有的英文字符。
    \\( \\) \\(和\\)之间出现的内容可以由\\num来替代。
    \\1\\2\\3 替代\\(和\\)之间出现的内容。
    \\u 将后续字符串的首字母大写。
    \\{num} 与前一字符的num次出现匹配。

    现在,我们对脚本逐条讲解,希望能帮助大家理解正则文法。

    ⑴:%s/ / /
    将文件中每行出现的2个空格替换为10个空格。

    zhang.fei 430759701022003
    diao.chan 651302801225012
    guan.yu 342869680413001
    xi.shi 120638780214006
    liu.bei 210324650708001

    ⑵:%s/\\(............\\)\\( *\\)/\\1/
    保留行首的12个字符,将其余的空格删除,这样,前两个字段就对齐了。

    zhang.fei 430759701022003
    diao.chan 651302801225012
    guan.yu 342869680413001
    xi.shi 120638780214006
    liu.bei 210324650708001

    ⑶:%s/\\([A-Za-z][A-Za-z]*\\)\\(\\.\\)\\([A-Za-z][A-Za-z]*\\)/\\u\\3\\2\\u\\1/
    将文件中每行出现的雇员姓名互换,并将首字母大写。


    Fei.Zhang 430759701022003
    Chan.Diao 651302801225012
    Yu.Guan 342869680413001
    Shi.Xi 120638780214006
    Bei.Liu 210324650708001

    ⑷:%s/$/ xxxxxx/
    在每一行的行尾添加2个空格和6个x

    Fei.Zhang 430759701022003 xxxxxx
    Chan.Diao 651302801225012 xxxxxx
    Yu.Guan 342869680413001 xxxxxx
    Shi.Xi 120638780214006 xxxxxx
    Bei.Liu 210324650708001 xxxxxx

    ⑸:%s/\\([0-9]\\{6}\\)\\([0-9]\\{6}\\)\\([0-9]\\{3}\\) \\(xxxxxx\\)/\\1\\2\\3 \\2/
    将xxxxxx替换成出生年月日。


    Fei.Zhang 430759701022003 701022
    Chan.Diao 651302801225012 801225
    Yu.Guan 342869680413001 680413
    Shi.Xi 120638780214006 780214
    Bei.Liu 210324650708001 650708

    ⑹:%s/\\(..\\)\\(..\\)\\(..\\)$/19\\1\\/\\2\\/\\3
    将年月日用/字符分隔,并在年前添加19。


    Fei.Zhang 430759701022003 1970/10/22
    Chan.Diao 651302801225012 1980/12/25
    Yu.Guan 342869680413001 1968/04/13
    Shi.Xi 120638780214006 1978/02/14
    Bei.Liu 210324650708001 1965/07/08

    ⑺:%s/$/ xxxxxx/
    在每一行的行尾添加2个空格和6个x


    Fei.Zhang 430759701022003 1970/10/22 xxxxxx
    Chan.Diao 651302801225012 1980/12/25 xxxxxx
    Yu.Guan 342869680413001 1968/04/13 xxxxxx
    Shi.Xi 120638780214006 1978/02/14 xxxxxx
    Bei.Liu 210324650708001 1965/07/08 xxxxxx

    ⑻:%s/\\([0-9]\\{14}[13579]\\)\\(.*\\)\\(xxxxxx\\)/\\1\\2male /
    身份证号码末位是奇数的,将xxxxxx替换成male

    Fei.Zhang 430759701022003 1970/10/22 male
    Chan.Diao 651302801225012 1980/12/25 xxxxxx
    Yu.Guan 342869680413001 1968/04/13 male
    Shi.Xi 120638780214006 1978/02/14 xxxxxx
    Bei.Liu 210324650708001 1965/07/08 male

    ⑼:%s/\\([0-9]\\{14}[02468]\\)\\(.*\\)\\(xxxxxx\\)/\\1\\2female/
    身份证号码末位是偶数的,将xxxxxx替换成female


    Fei.Zhang 430759701022003 1970/10/22 male
    Chan.Diao 651302801225012 1980/12/25 female
    Yu.Guan 342869680413001 1968/04/13 male
    Shi.Xi 120638780214006 1978/02/14 female
    Bei.Liu 210324650708001 1965/07/08 male

    ⑽:$ 到文件的最后一行


    ⑾:s/.*/&^M-----------------------------------------------
    在文件的最末行插入一行 "-" 字符。


    Fei.Zhang 430759701022003 1970/10/22 male
    Chan.Diao 651302801225012 1980/12/25 female
    Yu.Guan 342869680413001 1968/04/13 male
    Shi.Xi 120638780214006 1978/02/14 female
    Bei.Liu 210324650708001 1965/07/08 male
    -----------------------------------------------

    ⑿:g/female/.m$
    将所有的女员工记录移至文件尾。


    Fei.Zhang 430759701022003 1970/10/22 male
    Yu.Guan 342869680413001 1968/04/13 male
    Bei.Liu 210324650708001 1965/07/08 male
    -----------------------------------------------
    Chan.Diao 651302801225012 1980/12/25 female
    Shi.Xi 120638780214006 1978/02/14 female

    笔者目前正在为某外资公司从事大型机(IBM S/390)的软件开发,一切工作都在TSO环境中进行。为了对编写的程序进行测试,必须准备测试数据。有过大型机开发经验的人会知道,通过TSO,输入字符型数据还可以,如果要输入16进制数据,操作起来很麻烦。因为16进制数是纵向排列的,输入时既不方便,又很容易错位。怎么解决呢?我尝试了几种办法,实际证明,用VIM最方便。


    例六、下列数据 1234567890ABCDEF ,将其变成 13579ACE 24680BDF 的形式,这样,数据就可以很方便的粘贴到TSO环境中了。


    下面给出宏命令脚本change_d.vim

    "----------------------------------------------------
    "Macro Function : Convert Char Arrange Direction
    "
    " Sample : 40 50 60 ==> 4 5 6
    " 0 0 0
    " Date : 2001/12/01
    " Author : Yan Shi
    "----------------------------------------------------
    :s/.*/&^M/
    :1
    :map = malx+$p-`al=

    说明如下:

    ⑴ :s/.*/&^M/ 在数据行下方添加一空行。
    ⑵ :1 回到文件的首行的首字符。
    ⑶ :map = malx+$p-`al= 将一大串VIM命令映像给字符=

    ① ma 将首字符标记为a
    ② l 光标右移一个字符
    ③ x 删除光标处字符
    ④ + 移至下一行
    ⑤ $ 到行尾
    ⑥ p 将删除的字符粘贴
    ⑦ - 回至上一行
    ⑧ `a 返回到标记字符处
    ⑨ l 光标右移一个字符
    ⑩ = 递归调用,重复以上步骤,直到将该行所有的数据处理完。

    上面的这几个实例,展示了VIM强大的文本处理功能,但这远不能覆盖其全貌。VIM的命令很多,而且使用灵活,需要狠下一番气力才能熟练掌握。笔者年龄尚小,经验还很欠缺,希望本文能够起到抛砖引玉的作用。由于时间的原因,上述实例仅在DOS和WINDOWS环境下测试,没有在其他系统下进行进一步的测试,希望各位同行、前辈不吝赐教,谢谢!


    ※ VIM 意为 VI Improved ,与VI99%向下兼容。而且,VIM提供了许多VI不具备的功能,内置了诸多函数,因此,建议有经验的VI用户对VIM有所了解,您会发现,转向VIM 是明智之举。欲查询有关VIM的资料,请参考 http://www.vim.org


    注:本文使用 VIM 6.0 版本



    点击:立刻体验尚观高水平Linux课程!




    精彩Linux视频、嵌入式视频、Android视频、Oracle视频,免费先学!
    查看:尚观Linux培训学员最新就业薪资待遇统计报告!
    查看:UGA-4G Android开发架构师大纲
    查看:UDA-Linux服务器开发架构师大纲
    查看:UEA-嵌入式内核驱动开发者大纲
    查看:UOA-Oracle数据库集群架构大纲
    查看:ULA-Linux系统与集群架构师大纲

    填表获取 Linux、嵌入式、Oracle 技术资料

  • 姓    名:
  • 固    话:
  • 手    机:
  • E-Mail :
  • 所在地:
  •         

北京(总部)

电子地图
电话:(010)62113016/17 68949060
地址:北京海淀区中关村南大街 甲10号 银海大厦南区410-418

上海(Shanghai)

电子地图
电话:(021)64859996 64859889
地址:上海徐汇区钦江路333号漕河泾开发区38号楼申能科技3楼

深圳(Shenzhen)

电子地图
电话:(0755)82995128 82995168
地址:深圳福田区 彩田路 中深花园B2005室

沈阳(Shenyang)

电子地图
电话:(024)31500816 31500817
地址:沈阳和平区三好街54号物产科贸大厦2号楼201室

大连(Dalian)

电子地图
电话:(0411)84336822 84326822
地址:大连沙河口区西安路86号行政大厦(罗斯福广场对面)17楼1705室

成都(Chengdu)

电子地图
电话:(028)66677820 66677828
地址:成都青羊区上西顺城街252号顺吉大厦8楼B4

广州(Guangdong)

电子地图
电话:(020) 88900632 81368992
地址:广州市越秀区人民北路612号中广大厦9层(国际银行中心旁)

南京(Nanjing)

电子地图
电话:(025)83176720 83176710
地址:南京新街口广场中山东路9号天时科技园12层G、H单元

武汉(Wuhan)

电子地图
电话:(027)87596339
地址:武汉市洪山区鲁磨路118号国光大厦A座1201室1203室




2005-2009高新技术企业

LPI授权培训考试中心

CSDN战略伙伴

51Job战略伙伴

Oracle WDP授权培训与考试中心

Intel软件服务培训供应商

Redhat授权培训与考试中心

高新技术企业证书
 

友情链接(联系QQ:304853420):   LPI  RedHat  CSDN  ChinaUnix  ITPub  Eygle.Com  Linux培训  嵌入式培训  Linux联盟  Unix爱好者  51CTO开发 尚观知识库 天极导航  PHP中国  网易教育  天津赶集网  工具软件下载  连锁加盟  天极网南京站  个人简历模板  北京赶集网  畅享网  网页制作  Linux  ZOL服务器  广告联盟  颈椎病的症状  21CN教育  亿芯网  强直性脊柱炎  数码比价网  投资创业  DJ网站  嵌入式技术网  OCM培训  股票入门  大功率LED网   搜电网  杭州写字楼网  时尚论坛  医药营销联盟  Linux技术中心  泉州人才网  大学后  天天健康  RHCE培训  SVN中文技术网  网罗天下  Oracle培训  北京法律咨询  嵌入式资讯网  Fedora中文爱好者  沸点100网   教培英才网  中国二手车城  Linux公社  Oracle教程  深圳本地宝  狂人网  0090网址大全  数码比价网  中国程序员人才网  IT英才网

  • PR
COPYRIGHT © 2000-2009 北京尚观科技有限公司 - 北京市海淀区尚观培训学校 - Linux培训及嵌入式培训专家 ALL RIGHTS RESERVED

咨询热线:400-700-0056    800-810-0056
在线咨询:QQ:814996026    院校洽谈合作专线:13911737012(张老师)
京ICP备09018548号 | Linux就业信息 | 免责声明 | 隐私声明 |