magedu_20160808

行编辑器sed与vim文本处理器

    一.行编辑器sed的使用介绍

    sed英文全称stream editor,行编辑器。其工作模式为将文件中内容按行转移至sed模拟空间中,根据地址判定此行是否匹配,如果匹配,根据命令输出并打印,如果不匹配,按照默认打印到屏幕上。它的作用是根据选项和地址界定‘script’命令实现对符合相关筛选条件的行更改显示。其用法为:sed [option]… 'script' file 。


      1.选项

    -n:只显示匹配到的行,不匹配的行统统不显示

    -e:多点编辑

    -f 文件绝对路径:从指定路径文件中读取编辑脚本

    -r:支持使用扩展正则表达式

    -i:在原文件中编辑

    只有选项无法匹配所需要的固定行,这里需要搭配地址命令‘script’选取固定范围来使用。


      2.地址

    地址范围的选定有时会根据正则表达式的形式匹配,常见的地址范围规定有如下:

    a.单地址

    #(数字):代表所匹配的固定行

    /pattern/:pattern匹配的符合条件的每一行

    b.无地址:对全局进行处理

    c.地址范围

    #1,#2:从#1行到#2行

    #1,+#2:从#1开始,一直到#1+#2之间的所有行

    /part1/,/part2/:从符合part1的第一行到符合part2的第一行的中间所有行

    #,/part/:从第#行到符合part条件的第一行中间的所有行

    d.步进表示

    ~:1~2代表奇数行

       2~2代表偶数行   (#1~#2说白了就是选取从#1开始每隔#2-1行的所有行)

      3.编辑命令

    d:删除匹配行

    p:显示模式空间的内容

    i /test:在行前面插入test文本内容,支持使用\n进行多行插入

    a /test:在行后面插入test文本内容,支持使用\n进行多行插入

    c /test:替换行为test文本,也支持使用多行替换

    w /path/to/somefile:保存匹配的行内容至指定文件中

    r /path/to/somefile:读取指定文件内容至模式空间中匹配到的行的行后

    =:将模式空间行的行数打印出来

    !:模式空间匹配的行进行取反处理

    基本使用方式如下所例:

  1.显示文件f2中以user[0-9]命名的用户

[root@localhost testdir]# cat f2
     1	root:x:0:0:root:/root:/bin/bash
     2	bin:x:1:1:bin:/bin:/sbin/nologin
     3	daemon:x:2:2:daemon:/sbin:/sbin/nologin
     4	adm:x:3:4:adm:/var/adm:/sbin/nologin
     5	lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
     ...

[root@localhost testdir]# sed -n '/user[0-9]/p' f2
    48	user1:x:1100:1102:dafeige:/home:/bin/bash
    49	user2:x:1101:1101:dafeige:/home:/bin/bash

  2.使用管道连接并在f2文件的第46行上,下加入“wohenshuai”的文本内容。第三个命令是将第46行内容替换成“wohenshuai”

[root@localhost testdir]# sed -n '46p' f2|sed 'a wohenshuai'
    46	harry:x:1004:1005::/home/harry:/bin/bash
wohenshuai
[root@localhost testdir]# sed -n '46p' f2|sed 'i wohenshuai'
wohenshuai
    46	harry:x:1004:1005::/home/harry:/bin/bash
[root@localhost testdir]# sed -n '46p' f2|sed 'c wohenshuai'
wohenshuai

  3.取反的使用示例,这里使用!将包含非‘echo’的行显示打印

[root@localhost testdir]# cat f1
#!/bin/bash
echo "mike a temp file"
echo
mktemp /temp/test.XXXX
[root@localhost testdir]# sed -n '/echo/!p' f1
#!/bin/bash
mktemp /temp/test.XXXX

  4.多点操作-e的使用:在xiaojiji文件选取含有root或两位数的行,显示打印

[root@localhost testdir]# sed -n -e '/\<[[:digit:]][[:digit:]]\>/p' -e '/root/p' xiaojiji 
root:x:0:0:root:/root:/bin/bash
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
games:x:12:100:games:/usr/games:/sbin/nologin
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
nobody:x:99:99:Nobody:/:/sbin/nologin
dbus:x:81:81:System message bus:/:/sbin/nologin
tss:x:59:59:Account used by the trousers package to sandbox the tcsd daemon:/dev/null:/sbin/nologin
rpc:x:32:32:Rpcbind Daemon:/var/lib/rpcbind:/sbin/nologin
radvd:x:75:75:radvd user:/:/sbin/nologin
rpcuser:x:29:29:RPC Service User:/var/lib/nfs:/sbin/nologin
saslauth:x:991:76:Saslauthd user:/run/saslauthd:/sbin/nologin
gdm:x:42:42::/var/lib/gdm:/sbin/nologin
avahi:x:70:70:Avahi mDNS/DNS-SD Stack:/var/run/avahi-daemon:/sbin/nologin
sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
postfix:x:89:89::/var/spool/postfix:/sbin/nologin
ntp:x:38:38::/etc/ntp:/sbin/nologin
tcpdump:x:72:72::/:/sbin/nologin

    4.行编辑内容的查找替换(比较常用)

    ‘s///’或‘s@@@’或‘s###’前两个//或@@或##之间为查询的匹配内容,后两个符号之间为替换内容,如果想要在原内容上追加内容,可以使用&表示查找的原内容。举例说明:

 将文件f1中所有以#打头的行前面加上一个$符号:

[root@localhost testdir]# cat f1
#!/bin/bash
echo "mike a temp file"
echo
mktemp /temp/test.XXXX
[root@localhost testdir]# sed 's/^#/$&/' f1
$#!/bin/bash
echo "mike a temp file"
echo
mktemp /temp/test.XXXX

其中地址可以使用's@^#@$&@'或's#^\##$&#'来代替。


sed存在高级模式为h,H,G,g,x,n,D,d等,涉及到模式空间下的保持空间内容,这里不做叙述,相关内容在pdf文件中。


    二.vim编辑器的强大功能

    与nano文本编辑不同,vim作为vi的强化版文本编辑器,有着强大但众多的编辑功能,使用便利但由于编辑方式众多,不如nano简洁,所以对于初学者无法短期内熟练掌握其所有编辑方式。其操作模式分为命令模式、编辑模式、扩展命令模式三大种。其模式的转换由键盘上的固定字符执行:Esc、:、i、v。其转换关系如下图:

1470665805965474.jpg

      1.vim打开文件的方式

    vim编辑器可以使用‘+’选项指定一些特定的方式进入文本模式:

    vim [option]… File…

    [option]:

    +#:进入文本让光标停留在第#行行首

    +/pattern:进入文本让光标停留在第一个匹配到pattern行的行首

    +:进入文本光标停留在最后一行行首

    -d file1 file2:对比file1与file2两个文件内容

    -m:只读打开文件

    -e:直接进入扩展命令模式


    vim编辑器支持打开多个文件,vim file1 file2 file3….。并按照从左到右顺序打开,切换到扩展命令模式‘:’输入特定内容可实现文件内容的切换操作,如下所示:

    :next    显示下一个文件内容

    :prev    显示上一个文件内容

    :first   显示第一个文件内容

    :last    显示最后一个文件内容

    :wall    保存所有内容

    :qall    退出所有文件

    :wqall   保存并退出所有文件

    

      2.命令模式下常用的编辑命令

    当不加入选项进入vim编辑模式时,光标默认停留在首行行首上。这时键盘上的字母并不能编辑内容,而分别带有特殊意义。比如h,j,k,l代表控制光标的上下左右移动,效果等同于方向键。这里选取比较常见并且方便的由命令模式编辑文件的特殊字符:

      删除命令d:

    d$/D:删除当前行行标至行尾所有内容

    dd:删除行标所在当前行

    d0:删除当前行行首至行标所有内容

    d^:删除当前行非空格行首至行标内容

    dw,de,db:删除当前光标单词的操作。db表示删除行标所在处单词的词首至光标的字符,dw,de表示删除光标至词尾的字符

      复制命令y:

    y$:复制光标至行尾内容

    y0:复制行首至光标内容

    y^:复制非空格行首至光标内容

    Y/yy:复制当前行

      粘贴命令p:

    p:粘贴至当前行标下方

    P:粘贴至当前行标上方

    命令模式中粘贴多次字符的方式:100[i]mcgee[Esc]  其中[]内代表操作字符,[i]切换至编辑模式输入需要重复粘贴的字符,100为粘贴次数,mcgee为粘贴的字符,[Esc]键返回命令模式并执行重复粘贴操作。

      改变命令c:

    c:修改后切换至编辑模式

    cc:删除当前行并切换至编辑模式

    C/c$:删除行标至当前行尾内容并切换至编辑模式

    c0:删除行首至行标内容并切换至编辑模式

    c^:删除非空格行首至行标的内容并切换至编辑模式

    个人常用快速跳转光标操作(必须在命令模式下):G(跳转至文本最后行)、gg(跳转至文本首行)、0(跳转至当前行行首)、^(跳转至当前行非空格行首)、$(跳转至当前行行尾)、ctrl+左右(单词跳转)。

      恢复操作u:

    u:恢复之前内容。(这个功能非常重要,如果发生误操作更改,使用u即可恢复之前一次操作的文本内容了)

    U:撤销当前光标所在行的所有更改


      2.扩展模式的常用操作

    ‘:’代表切换至扩展模式,比如:q,:w,:wq!等代表保存文件以及退出与强制退出等。其实扩展命令模式看来有点像输入命令,Enter键入后执行对文本内容的操作,所以可以根据正则表达式的索引范围对特定字符的匹配行进行查找,找到后可执行修改操作。比如:

    :s///(@@@)(###)就与sed命令中的s///查找更改的作用一样。举例如下:

  文件f1内容如下:

#!/bin/bash
echo "mike a temp file"
echo
mktemp /temp/test.XXXX
~

  找寻文件中的bash,并将bash替换成csh

:s/bash/csh/g

 于是文件f1内容变为如下:

#!/bin/csh
echo "mike a temp file"
echo
mktemp /temp/test.XXXX

  默认情况下只匹配每行的第一个匹配字符,其中g代表匹配全局,还有i,代表忽略大小写字符匹配

    在扩展模式中经常使用查找匹配的相关功能,下面介绍一些扩展模式地址匹配的界定符号:

    #(数字):指定#行

    #1,#2:指定#1至#2之间行         比如2,5  指2-5行

    #1,+#2:指定从#1至#1+#2之间行   比如2,+3 指2-5行

    .:代表当前行

    $:代表最后一行,$-1代表倒数第二行,以此类推$-n…代表倒数第n-1行

    %:代表全局,整个文本

    /pat1/,/pat2/:第一个匹配/pat1/的行至第一个匹配/pat2/的行

    /pat/支持使用正则表达式,可以与上述符号使用,如/path/,$代表匹配pat的第一行至最后一行

    这些地址界定在扩展模式的使用需要遵循固定格式,要在前面使用,后面跟上输出命令,比如:

  比如f2文件内容部分如下:

    33  saslauth:x:991:76:Saslauthd user:/run/saslauthd:/sbin/nologin
    34  libstoragemgmt:x:990:988:daemon account for libstoragemgmt:/var/run/lsm:/sbin/nologin
    35  pulse:x:171:171:PulseAudio System Daemon:/var/run/pulse:/sbin/nologin
    36  gdm:x:42:42::/var/lib/gdm:/sbin/nologin
    37  gnome-initial-setup:x:989:984::/run/gnome-initial-setup/:/sbin/nologin
    38  avahi:x:70:70:Avahi mDNS/DNS-SD Stack:/var/run/avahi-daemon:/sbin/nologin
    39  sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
    40  postfix:x:89:89::/var/spool/postfix:/sbin/nologin
    41  ntp:x:38:38::/etc/ntp:/sbin/nologin

  前面是个人使用echo重定向输入的行号,便于观察者理解。现在使用扩展模式删除36-39行的所有字母字符,如下操作:

:36,39s/[[:alpha:]]*//g

  于是文本内容变为:

    33  saslauth:x:991:76:Saslauthd user:/run/saslauthd:/sbin/nologin 
    34  libstoragemgmt:x:990:988:daemon account for libstoragemgmt:/var/run/lsm:/sbin/nologin 
    35  pulse:x:171:171:PulseAudio System Daemon:/var/run/pulse:/sbin/nologin 
    36  ::42:42::///:// 
    37  --::989:984:://--/:// 
    38  ::70:70: /- :///-:// 
    39  ::74:74:- :///:// 
    40  postfix:x:89:89::/var/spool/postfix:/sbin/nologin 
    41  ntp:x:38:38::/etc/ntp:/sbin/nologin 
    42  tcpdump:x:72:72::/:/sbin/nologin

    

      3.可视化模式VISUAL

     命令模式下v键切换至visual模式,结合d,y,p等命令,可以对选定的块进行操作,举例说明:  

  v键进入可视化模式,还是使用f2文件:  

~                                                                                              
~                                                                                              
-- VISUAL --

  光标选定块如图:

1470734501821819.jpg    

  按d删除,如下:

1470734581951725.jpg

  这里需要注意的是光标停留位置很重要,以这个位置为分隔符,可以向前或者后面内容进行移动,达到随意选取的功能。

    

    

原创文章,作者:mcgeewang,如若转载,请注明出处:http://www.178linux.com/31612

评论列表(1条)

  • 马哥教育
    马哥教育 2016-08-12 09:11

    关于sed和vim总结的很好,很详细,sed可以有一些示例,这样看起来会更丰满哦。