sed与vim浅析

sed与vim

sed

Stream EDitor, 行编辑器,sed是一种流编辑器,它一次处理一行内容。处理时,把当前处理的行存储在临时缓冲区中,称为“模式空间”( pattern space),接着用sed命令处理缓冲区中的内容,处理完成后,把缓冲区的内容送往屏幕。接着处理下一行,这样不断重复,直到文件末尾。文件内容并没有改变,除非你使用重定向存储输出。Sed主要用来自动编辑一个或多个文件,简化对文件的反复操作,编写转换程序等。

    用法: 

    sed [option]… 'script' inputfile… 

    script: '地址命令'

   常用选项:

    -n:不输出模式空间内容的自动打印

    -e: 多点编辑

    -f /PATH/TO/SCRIPT_FILE: 从指定文件中读取编辑脚本

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

    -i: 原处编辑

注意这里:↓

sed -i.bak '^U /r /etc/issue' f3  

更f3文件之前先把f3文件备份为 f3.bak文件,在对f3文件进行更改

编辑命令:

    d: 删除模式空间匹配的行

    p: 显示模式空间中的内容

    a \text:在行后面追加文本;支持使用\n实现多行追加

        sed ‘/root/a\superman’  /etc/passwd

[root@centos6 ~]# sed '/root/a\superman' /etc/passwd
        root:x:0:0:root:/root:/bin/bash
        superman
        在匹配到的root行行后追加superman

    i \text:在行前面插入文本;支持使用\n实现多行插入

        sed ‘/root/i\superman’ /etc/passwd 

[root@centos6 ~]# sed '/root/i\superman' /etc/passwd
        superman
        root:x:0:0:root:/root:/bin/bash
        在匹配到的root行行前追加superman

    c \text:替换行为单行或多行文本

[root@centos6 ~]# sed '/root/c\superman' /etc/passwd
        superman
        bin:x:1:1:bin:/bin:/sbin/nologin
        代替匹配到的行

    w /path/to/somefile: 保存模式匹配的行至指定文件

[root@centos6 ~]# sed  '/root/ w/etc/issue' /etc/passwd
        root:x:0:0:root:/root:/bin/bash
        [root@centos6 ~]# cat /etc/issue
        root:x:0:0:root:/root:/bin/bash

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

[root@centos6 ~]# sed '/root/ r/etc/issue' /etc/passwd
        root:x:0:0:root:/root:/bin/bash
        CentOS release 6.8 (Final)
             Kernel \r on an \m

    =: 为模式空间中的行打印行号

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

    s///:查找替换,支持使用其它分隔符,s@@@,s###

地址定界: 

    (1) 不给地址:对全文进行处理

    (2) 单地址: #: 指定的行 /pattern/:被此处模式所能够匹配到的每一行

[root@centos6 ~]# nl /etc/passwd | sed -n 3p 
     3daemon:x:2:2:daemon:/sbin:/sbin/nologin

    (3) 地址范围: #,# #,+# /pat1/,/pat2/ #,/pat1/

[root@centos6 ~]# sed -n '1,6p' /etc/passwd
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync

    (4) ~:步进 1~2 奇数行 2~2 偶数行

[root@centos6 ~]# nl /etc/passwd | sed -n 1~2p 
     1root:x:0:0:root:/root:/bin/bash
     3daemon:x:2:2:daemon:/sbin:/sbin/nologin
     5lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
     7shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
     9mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
[root@centos6 ~]# nl /etc/passwd | sed -n 2~2p 
     2bin:x:1:1:bin:/bin:/sbin/nologin
     4adm:x:3:4:adm:/var/adm:/sbin/nologin
     6sync:x:5:0:sync:/sbin:/bin/sync
     8halt:x:7:0:halt:/sbin:/sbin/halt
      10uucp:x:10:14:uucp:/var/spool/uucp:/sbin/nologin

替换标记:

    g: 行内全局替换

    p: 显示替换成功的行

    w /PATH/TO/SOMEFILE:将替换成功的行保存至文件中

看下这几个示例:

1、sed ‘/^$/d’ file 

[

root@centos6 ~]# cat -n /etc/issue
     1CentOS release 6.8 (Final)
     2Kernel \r on an \m
     3
[root@centos6 ~]# nl /etc/issue | sed '/^$/d' 
     1CentOS release 6.8 (Final)
     2Kernel \r on an \m
通过示例看出编辑命令d删除/^$/(空行)

2、nl /etc/passwd | sed ‘2,5d’ 

[root@centos6 ~]# nl /etc/passwd | sed '2,5d'
     1root:x:0:0:root:/root:/bin/bash
     6sync:x:5:0:sync:/sbin:/bin/sync
     7shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
     8halt:x:7:0:halt:/sbin:/sbin/halt
     9mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
    10uucp:x:10:14:uucp:/var/spool/uucp:/sbin/nologin
删除第二道第五行。

3、nl /etc/passwd | sed ‘2a tea’

[root@centos6 ~]# nl /etc/passwd | sed '2a tea'
     1root:x:0:0:root:/root:/bin/bash
     2bin:x:1:1:bin:/bin:/sbin/nologin
tea
     3daemon:x:2:2:daemon:/sbin:/sbin/nologin
第二行后追加tea

4、sed –n‘s/root/&superman/p’ /etc/passwd  

[root@centos6 ~]# sed -n 's/root/&superman/p' /etc/passwd
rootsuperman:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/rootsuperman:/sbin/nologin
&为引用前面的root,在root单词后后追加superman

5、sed –n‘s/root/superman&/p’ /etc/passwd 单词前 

同上面的示例。

6、-e选项:

[root@centos6 ~]# cat f1
zang zang zang
root root root
1234 1234 1234
zang root 1234
[root@centos6 ~]# sed -e 's/root/root1/pg' -e 's/zang/haha/pg' -n f1
haha haha haha
root1 root1 root1
zang root1 1234
haha root1 1234
(-n:不输出模式空间内容的自动打印。)
[root@centos6 ~]# sed -e 's/root/root1/pg' -e 's/zang/haha/pg'  f1
haha haha haha      替换后输出到显示器
haha haha haha      默认输出到显示器
root1 root1 root1     替换后输出到显示器
root1 root1 root1     默认输出到显示器
1234 1234 1234      没有匹配更改,默认输出到显示器
zang root1 1234      先匹配root,更改后输出到显示器
haha root1 1234      匹配到zang,更改后显示输出到显示器
haha root1 1234      默认输出到显示器

7、显示空行号和打印空行号:

sed -n ‘/^$/=’  file 显示空行行号
[root@centos6 ~]# sed -n '/^$/=' /etc/issue
3
 
sed –n –e ‘/^$/p’ –e ‘/^$/=’  file 
[root@centos6 ~]# sed -n -e '/^$/p' -e '/^$/=' /etc/issue
3
打印空行,为空行打印行号。

8、地址界定的用法之一:  #,/pat1/ 

sed –n ‘2,/lp/p’  /etc/passwd 

[root@centos6 ~]# nl /etc/passwd | sed -n '2,/lp/p'
     2bin:x:1:1:bin:/bin:/sbin/nologin
     3daemon:x:2:2:daemon:/sbin:/sbin/nologin
     4adm:x:3:4:adm:/var/adm:/sbin/nologin
     5lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
从2行开始到匹配到的lp的行

高级编辑命令:

     h: 把模式空间中的内容覆盖至保持空间中

     H:把模式空间中的内容追加至保持空间中

     g: 从保持空间取出数据覆盖至模式空间

     G:从保持空间取出内容追加至模式空间

     x: 把模式空间中的内容与保持空间中的内容进行互换

     n: 读取匹配到的行的下一行覆盖至模式空间

     N:追加匹配到的行的下一行至模式空间

     d: 删除模式空间中的行

     D:删除当前模式空间开端至\n的内容(不在传至标准输出),放弃之后的命令,但是对剩余模式空间重新执行sed

在来看下这些示例:

sed -n 'n;p' FILE 

[root@centos6 ~]# nl /etc/passwd | sed -n 'n;p'
     2  bin:x:1:1:bin:/bin:/sbin/nologin
     4  adm:x:3:4:adm:/var/adm:/sbin/nologin
     6  sync:x:5:0:sync:/sbin:/bin/sync
     8  halt:x:7:0:halt:/sbin:/sbin/halt
    10  uucp:x:10:14:uucp:/var/spool/uucp:/sbin/nologin
    12  games:x:12:100:games:/usr/games:/sbin/nologin
    14  ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
    16  dbus:x:81:81:System message bus:/:/sbin/nologin
偶数行

sed '$!N;$!D' FILE 

[root@centos6 ~]# nl /etc/passwd | sed '$!N;$!D' 除了最后一行
    40  mage:x:505:505::/home/mage:/bin/bash
    41  zanghl:x:506:506::/home/zanghl:/bin/bash
显示后两行

sed '$!d' FILE

[root@centos6 ~]# nl /etc/passwd | sed '$!d'
    41  zanghl:x:506:506::/home/zanghl:/bin/bash
除了最后一行全部都删除,只显示最后一行。

sed ‘G’ FILE 

[root@centos6 ~]# sed 'G' /etc/passwd
root:x:0:0:root:/root:/bin/bash

bin:x:1:1:bin:/bin:/sbin/nologin

给每一行追加一个空行

sed ‘g’ FILE 

g: 从保持空间取出数据覆盖至模式空间

保持空间为空,复制后的结果就是把原文件的每一行都变成空行。

sed ‘/^$/d;G’ FILE

[root@centos7 ~]# sed '/^$/d;G' /etc/passwd
root:x:0:0:root:/root:/bin/bash

bin:x:1:1:bin:/bin:/sbin/nologin

daemon:x:2:2:daemon:/sbin:/sbin/nologin

...
删除空行;(G:从保持空间取出内容追加至模式空间),保持空间为空,追加输出到模式空间。
这个命令输出的结果就是在没行下面加一个空行。

sed 'n;d' FILE 

[root@centos7 ~]# nl /etc/passwd | sed 'n;d'
     1  root:x:0:0:root:/root:/bin/bash
     3  daemon:x:2:2:daemon:/sbin:/sbin/nologin
     5  lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
     7  shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
     9  mail:x:8:12:mail:/var/spool/mail:/sbin/nologin

sed -n '1!G;h;$p' FILE

[root@centos7 ~]# sed -n '1!G;h;$p' /etc/passwd
mage:x:19999:19999::/home/mage:/bin/csh
zzzz:x:2012:2012::/home/zzzz:/bin/bash
roobash:x:2011:2011::/home/roobash:/bin/bash
rootash:x:2010:2010::/home/rootash:/bin/bash
nologin:x:2009:2009::/home/nologin:/bin/bash
basher:x:2008:2008::/home/basher:/bin/bash
倒叙。

vim编辑器

     vi编辑器是所有Unix及Linux系统下标准的编辑器,他就相当于windows系统中的记事本一样,它的强大不逊色于任何最新的文

本编辑器。他是我们使用Linux系统不能缺少的工具。由于对Unix及Linux系统的任何版本,vi编辑器是完全相同的,学会它后,您将在Linux的世界里畅行无阻。

    vim具有程序编辑的能力,可以以字体颜色辨别语法的正确性,方便程序设计;因为程序简单,编辑速度相当快速。vim可以当作

vi升级版本,他可以用多种颜色的方式来显示一些特殊的信息。vim会依据文件扩展名或者是文件内的开头信息,判断该文件的内容

而自动的执行该程序的语法判断式,再以颜色来显示程序代码与一般信息。vim里面加入了很多额外的功能,例如支持正则表达式的

搜索、多文件编辑、块复制等等。 这对于我们在Linux上进行一些配置文件的修改工作时是很棒的功能。

使用vi和vim的三种主要模式:

    三种主要模式:

    命令模式(默认):移动光标,剪切/粘贴文本(进入vi的默认模式,能够进行复制、黏贴、删除等操作)

            100iwang [ESC] 粘贴“wang”100次

            <start position><command><end position> 

            Command:

            y 复制、d 删除、gU 变大写、gu 变小写

            例如 0y$ 命令意味着:0 → 先到行头

            y → 从这里开始拷贝

            $ → 拷贝到本行最后一个字符

            ye 从当前位置拷贝到本单词的最后一个字符

    插入(编辑)模式:修改文本(从默认模式按下‘i’即可进入)

    扩展命令模式:保存,退出等(从默认模式按下“:”、'?'、'/'即可进入)

        地址定界:

            :start_pos,end_pos

            #: 具体第#行,例如2表示第2行

            #,#: 从左侧#表示行起始,到右侧#表示行结尾

            #,+#: 从左侧#表示的行起始,加上右侧#表示的行数

            :2,+3  表示2到5行

            .: 当前行

            $: 最后一行

            .,$-1 当前行到倒数第二行

            %:全文,相当于1,$

            /pat1/,/pat2/ 从第一次被pat1模式匹配到的行开始,一直到第一次被

            pat2匹配到的行结束 #,/pat/ /pat/,$

            使用方式:后跟一个编辑命令 d or y

            w file: 将范围内的行另存至指定文件中

            r file:在指定位置插入指定文件中的所有内容

        查找

            /PATTERN:从当前光标所在处向文件尾部查找

            ?PATTERN:从当前光标所在处向文件首部查找

            n:与命令同方向          N:与命令反方向

    Esc键 退出当前模式

    Esc键 Esc键 总是返回到命令模式

打开文件:

    # vim [OPTION]… FILE…

    +#: 打开文件后,直接让光标处于第#行的行首

    +/PATTERN:打开文件后,直接让光标处于第一个被PATTERN匹配到的行的行首

    vim + file 直接打开file,光标在最后一行

    vim –b file 二进制方式打开文件

    vim –d file1 file2…  比较多个文件

    vim  -m file  只读打开文件

    ex  file 或 vim –e直接进入ex模式如果该文件存在,文件被打开并显示内容如果该文件不存在,当编辑后第一次存盘时创建它

关闭文件:

    扩展模式:

    :q 退出

    :q! 强制退出,丢弃做出的修改

    :wq 保存退出

    😡 保存退出

    命令模式:

    ZZ: 保存退出

    ZQ:不保存退出

模式转换:

    插入模式 —-> 命令模式 ESC

    命令模式 —-> 扩展模式 : 

    扩展模式 —-> 命令模式 ESC

    锁定和解锁:CTRL+s,Ctrl+q

000.png

移动光标,进入插入模式

    命令模式 –> 插入模式

    i: insert, 在光标所在处输入

    I:在当前光标所在行的行首输入

    a: append, 在光标所在处后面输入

    A:在当前光标所在行的行尾输入

    o: 在当前光标所在行的下方打开一个新行

    O:在当前光标所在行的上方打开一个新行

111.png

改变、删除、复制文本

222.png

vim的功能:

    块选择:

    这个功能可以让我们复制一个矩形区域的内容,十分方便。

    v:字符选择,会将光标经过的地方反白选择;

    V:行选择;

    Ctrl+v:块选择;

    y:复制反白的地方;

    d:删除反白的地方。

444.png

vim的寄存器:

    有26个命名寄存器和1个无命名寄存器,常存放不同的剪贴版内容,可以不同会话间共享。

    用a,b,…,z表示,用“寄存器表示,放在数字和命令之间 如:3"tyy 表示复制3行到t寄存器中"tp表示将t寄存器内容粘贴

    未指定,将使用无命名寄存器有10个数字寄存器,用0,1,…,9表示,0存放最近复制内容,1存放最近删除内容。当新的文本变

    更和删除 时,1转存到2,2转存到3,以此类推。数字寄存器不能 在不同会话间共享。

编辑二进制文件:

    以二进制方式打开文件 vim –b binaryfile

    扩展命令模式下,利用xxd命令转换为可读的十六进制:%!xxd

    扩展命令模式下,利用xxd命令转换回二进制 :%!xxd –r 

多文件模式:

    vim FILE1 FILE2 FILE3 …

        :next 下一个

        :prev 前一个

        :first 第一个

        :last 最后一个

        :wall 保存所有

        :qall 退出所有

        :wqall保存退出所有

使用多个“窗口”

    多文件分割 vim -o|-O FILE1 FILE2 …

    -o: 水平分割

    -O: 垂直分割

    在窗口间切换:Ctrl+w

    单文件窗口分割:

    Ctrl+w,s: split, 水平分割

    Ctrl+w,v: vertical, 垂直分割

    ctrl+w,q:取消相邻窗口

    ctrl+w,o:取消全部窗口

    wqall 退出

vim环境设置:

    需要注意的是,vim会将i我们的以前的行为都记录下来,以方便我们操作。

    vim常用的环境设置参数命令如下:

         :set nu  设置行号

         :set nonu 取消行号

         :set hlsearch 设置高亮度查找

         :set nohlsearch 取消高亮度查找

         :set backup 自动备份文件

         :set ruler 开启右下角状态栏说明

         :set showmode 显示左下角的INSERT之类的状态栏

         :set backspace={0,1,2} 设置退格键功能。为2时可以删任意字符。为0或1时仅可以删除刚才输入的字符。

         :set all 显示目前所有的环境参数值

         :set 显示与系统默认值不同的参数值

         :syntax on/off 是否开启依据相关程序语法显示不同的颜色

         :set bg=dark/light 是否显示不同的颜色色调

  但是我们没有必要每次使用vim都要重新设置一次各个参数值。我们可以通过配置文件来直接规定我们习惯的vim操作环境。整体vim的设置值一般是放在/etc/vimrc中的。我们一般不要修改这个文件。我们可以通过修改~/.vimrc这个文件。如果不存在,可以手动创建。

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