vi使用技巧

 
Vi 使用技巧
: 简介
Vi 命令可以说是 Unix/Linux 世界里最常用的编辑文件的命令了,很多人不喜欢 VI 因为它
的众多的命令集,但是我们只需要掌握基本的命令然后灵活地加以运用,相信你会象我一
样喜欢它的。
本文旨在更有条理有归纳性地介绍 VI 的一些最常用命令和一些高级的应用。
        

:基本命令介绍:

1) 光标命令
k,j,h,l---
上下左右光标移动命令,虽然你可以在Linux中使用键盘右边的四个光标键,
但是记住这四个命令还有非常有用的,也就是右手在键盘上放置的位置部分
nG ----n
为行数,该命令立即使光标跳到指定行。
Ctrl+G-----
光标所在位置的行数和列数报告
w,b------
使光标向前或向后跳过一个单词

2) 编辑命令
i,a,r -------
在光标的前,,上方插入字符命令(i=insert,a=append,r=replace)
cw,dw------
改变(置换)/删除光标所在处的单词的命令 (c=change,d=delete)
x,d$,dd -----
删除一个字符,光标所在处到行尾的所有字符,和整行的命令

3) 查找命令
/string, ?string-----
从光标所在处向后/向前查找相应的字符串的命令

4)拷贝复制命令
yy,p -----
拷贝一行到剪贴板/取出剪贴板中内容的命令

 

:常见问题及应用技巧

1) 在一个新文件中读/etc/passwd中的内容,取出用户名部分
vi file
:r /etc/passwd
在打开的文件file中光标所在处读入/etc/passwd
:%s/:.*//g
删除/etc/passwd中用户名后面的从冒号开始直到行尾的所有部分
:3r /etc/passwd
这是在指定的行号后面读入文件内容

另外一种方法删掉文件中所有的空行及以#开始的注释行
#cat squid.conf.default | grep -v '^$' | grep -v '^#'


2)
在打开一个文件编辑后才知道登录的用户对该文件没有写权,不能存盘
vi file
:w /tmp/1
既然没法存盘,不想放弃所做的所有修改,先临时存到/tmp/1
:20,59w /tmp/1
或者仅仅把第2059行之间的内容存盘成文件/tmp/1

3) VI编辑一个文件,但需要删除大段大段的内容
vi file
Ctrl+G
把光标移到需要删除的行的处按ctrl+G显示行号,再到结尾处再按Ctrl+G.
:23,1045d
假定两次行号为231045,则把这几间的内容全删除

也可以在开始和结束两行中用ma,mb命令标记后用:'a,'bd删除.

4) 在整个文件或某几行中在行首或行尾加一些字符串
vi file
:3,$s/^/some string /
在文件的第一行至最后一行的行首前插入some string
:%s/$/ some string/g
在整个文件每一行的行尾添加 some string

:%s/string1/string2/g 在整个文件中替换string1string2
:3,7s/string1/string2/
仅替换文件中的第三到七行中的string1string2


Note: s
substitute,%表示所有行,g表示global

5) 同时编辑两个文件,在两个文件中拷贝剪贴文本
vi file1 file2
yy
同时打开两个文件,在文件1的光标所在处拷贝所在行
:n
切换到文件2 (n=next)
p
在文件2的光标所在处粘贴所拷贝的行
:N
切换回文件1


6)
替换文件中的路径

:%s#/usr/bin#/bin#g 把文件中所有路径/usr/bin换成/bin
或者用
:%s//usr/bin//bin/g
'/'前用符号指出'/'是真的单个字符'/'

 

四:VI编程的高级技巧

1) 交换两个字符位置:      xp
2)
上下两行调换:      ddp
3)
把文件内容反转:      :g/^/m0/ ( 未通过 )
4) 上下两行合并:      J
5)
删除所有行:      dG
6)
从当前位置删除到行尾:      d$
7)
从当前位置复制到行尾:      y$ 如果要粘贴到 其他 地方 p 就可以了
由于 vi 是建立在 EX 上的 所以 当键入 : 时就来到了 EX 命令状态
8) :ab string strings
   
例如 ":ab usa United States of America" ,
        
当你在文见里插入 usa
         United States of America
就蹦出来了
9) :map keys new_seq
    
定义你当前 键盘命令
10) :set [all]
     vi or ex
的编辑状态
    
显示每行 :set nu
11)
在命令状态下, nyy 表示拷贝从光标行起的下 n 行内容, p 表示 paste, 可刚复制的内容粘贴             在光标处的下面。

12) 单个字符替换用r,覆盖多个字符用R,用多个字符替换一个字符用s,整行替换用S

13) :%s/old_word/new_word/g
这个指令是于在整个文件中替换特定字符串

14) 光标控制 

         k:上移      nk 上移n
          j:
下移       nj 下移n

    将光标移到第n行,按下 mk
    将光标移到第m行,按下 "ay'k
    即将第nm的行存到a寄存器,以此类推,bc........寄存器等,这样就可以将你常用的需要复用的内 容粘贴到不同的寄存器中以备用,想粘贴到某处,直接将光标移到某地,按下 ap 即可,以此类推,bc........寄存器等

    在当前屏幕中
        H
跳到第一行
        M
跳到中间一行
        L
跳到最后一行

                         ) :光标移至句尾
                         ( :光标移至句首
                          }:光标移至段落开头
                          {:光标移至段落结尾
                         0:(注意是数字零)光标移至当前行首
                         $:光标移至当前行尾
                       n+:光标下移n行
                        n-:光标上移n行
                       n$:光标移至第n行尾

屏幕翻滚类命令
       Ctrl+u
:向文件首翻半屏
       Ctrl+d
:向文件尾翻半屏
 Ctrl+f
:向文件尾翻一屏
Ctrl
b;向文件首翻一屏
nz
:将第n行滚至屏幕顶部,不指定n时将当前行滚至屏幕顶部。

15)

   删除命令操作
          d l
删除当前字符(与x命令功能相同)
          d 0
删除到某一行的开始位置
          d ^
删除到某一行的第一个字符位置(不包括空格或TA B字符)
          d w
删除到某个单词的结尾位置
          d 3 w
删除到第三个单词的结尾位置
          d b
删除到某个单词的开始位置
          d W
删除到某个以空格作为分隔符的单词的结尾位置
          d B
删除到某个以空格作为分隔符的单词的开始位置
          d 7 B
删除到前面7个以空格作为分隔符的单词的开始位置
          d
删除到某个语句的结尾位置
          d 4
删除到第四个语句的结尾位置
          d
删除到某个语句的开始位置
          d
删除到某个段落的结尾位置
          d {
删除到某个段落的开始位置
          d 7 {
删除到当前段落起始位置之前的第7个段落位置
          d d
删除当前行
          d /t e x t
删除从文本中出现“ t e x t”中所指定字样的位置,一直向前直到下一个该字样所出现的
            位置(但不包括该字样)之间的内容
          d fc
删除从文本中出现字符“c”的位置,一直向前直到下一个该字符所出现的位置(包括
         该字符)之间的内容
          d tc
删除当前行直到下一个字符“ c”所出现位置之间的内容
          D
删除到某一行的结尾
          d $
删除到某一行的结尾
          5 d d
删除从当前行所开始的5行内容
          d L
删除直到屏幕上最后一行的内容
          d H
删除直到屏幕上第一行的内容
          d G
删除直到工作缓存区结尾的内容
          d 1 G
删除直到工作缓存区开始的内容

     :.,$d (冒号,点,逗号,$号,d)

      :(冒号)命令行模式下,首先可以确定命令的范围,.()表示当前光标所在的行;$表示最后一行;.()$都可以用数字代替,如,:4,8d 表示的是删除从第4行到第8行的内容,这里的数字表示行号,如2表示第2行。要删除的两个行号之间用,(逗号)隔开

  修改命令操作
         c l
更改当前字符
         c w
修改到某个单词的结尾位置
         c 3 w
修改到第三个单词的结尾位置
         c b
修改到某个单词的开始位置
         c W
修改到某个以空格作为分隔符的单词的结尾位置
         c B
修改到某个以空格作为分隔符的单词的开始位置
         c 7 B
修改到前面7个以空格作为分隔符的单词的开始位置
         c 0
修改到某行的结尾位置
         c
修改到某个语句的结尾位置
         c 4
修改到第四个语句的结尾位置
         c
修改到某个语句的开始位置
         c }
修改到某个段落的结尾位置
         c {
修改到某个段落的开始位置
         c 7 {
修改到当前段落起始位置之前的第7个段落位置
         c tc
修改当前行直到下一个字符c所出现位置之间的内容
         C
修改到某一行的结尾
         c c
修改当前行
         5 c c
修改从当前行所开始的5行内容

     . (点) 重复上一次修改!

替换命令
  替换命令操作
        s
将当前字符替换为一个或多个字符
        S
将当前行替换为一个或多个字符
        5 s
将从当前字符开始的5个字符替换为一个或多个字符

    s/p1/p2/g:将当前行中所有p1均用p2替代
    :n1,n2s/p1/p2/g:将第n1n2行中所有p1均用p2替代
    :g/p1/s//p2/g:将文件中所有p1均用p2替换

vi替换使用规则:
         :g/s1/s/s2/s3/g
     第一个g表示对每一个包括s1的行都进行替换,第二个g表示对每一行包括s1的行所有的s2都用s3 替换
s
表示替换,s2是要被替换的字符串,他可以和s1相同(如果相同的话用//代替),s3是替换字符串

搜索命令 :
         /pattern
:从光标开始处向文件尾搜索pattern
        ?pattern
:从光标开始处向文件首搜索pattern
         n
:在同一方向重复上一次搜索命令
        N
:在反方向上重复上一次搜索命令

16)  fx     往右移动到 x 字符上
        Fx
    往左移动到 x 字符上
        tx
     往右移动到 x 字符前
        Tx
    往左移动到 x 字符后
            (注意:以上四个命令中,其中x是键入的字符)
        ;
     分号,配合 f t 使用,重复一次
        ,
     逗号,配合 f t 使用,反方向重复一次

 17) vi 环境选项 Solaris ksh

       noautoindent nomodelines noshowmode
       autoprint nonumber noslowopen
       noautowrite nonovice tabstop=8
       nobeautify nooptimize taglength=0
       directory=/var/tmp paragraphs=IPLPPPQPP LIpplpipnpbtags=tags /usr/lib/tags
       noedcompatible prompt tagstack
       noerrorbells noreadonly term=vt100
       noexrc redraw noterse
       flash remap timeout
       hardtabs=8 report=5 ttytype=vt100
       noignorecase scroll=11 warn
       nolisp sections=NHSHH HUuhsh+c window=23
       nolist shell=/bin/ksh wrapscan
       magic shiftwidth=8 wrapmargin=0
       mesg noshowmatch nowriteany

       For C-Shell:
       setenv EXINIT "set nu"
       For Bourne or Korn Shell:
       EXINIT="set nu"; export EXINIT
       For Korn Shell Only (alternate method):
       typeset -x EXINIT="set nu"
   在 .profile 里设置 vi 的环境选项 , 以上均测试过

18) 标记文本

       mchar  用字母char标记当前光标的位置
     `char  移至char所标记处
     'char  移至char标记所在行的开头处
     "    移至当前行上一次所在位置(在光标移动之后)――一个双引号
     ''    移至当前行上第一次所在位置的行的开头处(在光标移动之后)――两个单引号

19)  同时vi多个文件时,CTRL-SHIFT-6回到上一个文件,在本次vi的文件和上次vi的文件之间切换。
    但是我发现一个BUG:在用CTRL-SHIFT-6切换到上一个文件后,用:args查看多文件vi状态时,
    屏幕底部仍然显示目前vi的是刚才的文件。
       (
HP-UX,Solaris,AIX上通过)

       也可以使用:
       :e#
    进行切换

20)
       sco
VI 要在文本前同样的字符加用
       %s/^/
要加的内容/g 要在文本后同样的字符加
       %s/$/
要加的内容/g

21)
    如何去掉文本中的 ^M 硬回车?不必用binary传回去再ascii传回来的方式,用shell或者unix语句实现。

    cat filename |tr -d '15' >newfile
    不同的unix系统还存在一些其他不同的命令,:doscp
        sed
也可以实现这个功能

    dos2unix filename filename2
    反之
        unix2dos filename filename2

        vi 中用:$s/^M//g
        ^
crtl-V crtl-M

22)  如何在“unix命令行”下将一个文件的某字符串用另一个串换掉

        sed 's/string1/string2/gp' file1 > file2

23) /etc/hosts下所有的地址都ping 2

    1   #/usr/bin/sh
        2   #grad /etc/hosts and ping each address
        3   cat /etc/hosts|grep -v '^#' | while read LINE
        4   do
        5   ADDR=`awk '{print $1}'`
        6   for MACHINE in $ADDR
        7   do
        8   ping $MACHINE -n 2
        9   done
       10  done

24) 文件加密:     :X

         在命令模式下输入后,系统会提示输入密码,输入密码后存盘退出,保存后就加密了,下次编辑时使 用vi –x filename,系统会提示你输入密码。

 25) 选项设置
                all
:列出所有选项设置情况
            term
:设置终端类型
    ignorance
:在搜索中忽略大小写
              list
:显示制表位(Ctrl+I)和行尾标志($)
       number
:显示行号
         report
:显示由面向行的命令修改过的数目
           terse
:显示简短的警告信息
           warn
:在转到别的文件时若没保存当前文件则显示NO write信息
      nomagic
:允许在搜索模式中,使用前面不带“/”的特殊字符
nowrapscan
:禁止vi在搜索到达文件两端时,又从另一端开始
           mesg
:允许vi显示其他用户用write写到自己终端上的信息

26) 最后行方式命令
       :n1,n2 co n3                     :将n1行到n2行之间的内容拷贝到第n3行下
       :n1,n2 m n3                      :将n1行到n2行之间的内容移至到第n3行下
       :n1,n2 d                            :将n1行到n2行之间的内容删除
       :w                                     :保存当前文件
       :e filename                        :打开文件filename进行编辑
       :x                                      :保存当前文件并退出
       :q                                      :退出vi
       :q!                                     :不保存文件并退出vi
       :!command                        :执行shell命令command
       :n1,n2 w!command           :将文件中n1行至n2行的内容作为command的输入并执行之,若不指
                               定n1n2,则表示将整个文件内容作为command的输入
       :r!command                       :将命令command的输出结果放到当前行

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
`vi` 是 Linux 和 Unix 系统中的一个文本编辑器,它非常强大且功能丰富,适合于命令操作。以下是一些常用的 `vi` 使用技巧: 1. **打开文件**: - `vim <file>` 打开现有文件 - `vi +<line_number> <file>` 打开文件并跳转到指定 - `vi new_file.txt` 创建新文件 2. **基本编辑模式与命令模式**: - 进入命令模式,按下 `Esc` 键或直接输入 `:` - 进入插入模式,按下 `i` 或者 `a` 插入文本 - 退出编辑模式,按 `Esc` 或在命令模式下输入 `:wq` 保存并退出,`:q!` 强制退出不保存 3. **光标移动**: - `h`, `j`, `k`, `l` 分别是向左、下、上、右移动一个字符 - `0` 移动到首, `$` 移动到尾 - `gg` 移动到文件开头,`G` 移动到文件结尾 4. **查找和替换**: - `/pattern` 查找,`n` 向下查找下一个匹配,`N` 向上查找 - `:s/old/new/g` 替换当前所有匹配的文本,`%s/.../.../g` 替换全文件 5. **撤销和重做**: - `u` 撤销上一步操作 - `U` 重做上一步操作(撤销的逆操作) 6. **模式切换快捷键**: - `i` 和 `a` 进入插入模式进文本输入 - `I` 开始首插入 - `o` 在光标下方添加新的一行,`O` 在上方添加 7. **使用 hjkl 移动光标,zz 键存档并回退到命令模式** 8. **宏命令**(`:define` 和 `:execute`):可以定义和重复复杂的编辑序列。 **相关问题**: 1. 如何在vi中创建一个新的? 2. 如何查找文本并跳至下一个匹配位置? 3. 宏命令在实际编辑中有哪些应用场景?

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值