文本处理工具sed的使用以及Vim的使用技巧详解

一、什么是sed
    sed的英文全称是Stream EDitor,叫行编辑器。
    sed是一种流编辑器,它一次处理一行内容。处理时,把当前处理的行存储在临时缓冲区中,称为“模式空间”(pattern space),接着用sed命令处理缓冲区中的内容,处理完成后,把缓冲区的内容送往屏幕。接着处理下一行,这样不断重复,直到文件末尾。文件内容并没有改变,除非你使用重定向存储输出。 Sed主要用来自动编辑一个或多个文件,简化对文件的反复操作,编写转换程序等。
二、sed的使用
    sed工具
    用法:
    sed [option]... 'script' inputfile...
 常用选项:
    -n:不输出模式空间内容的自动打印
    -e: 多点编辑
    -f /PATH/TO/SCRIPT_FILE: 从指定文件中读取编辑脚本
    -r: 支持使用扩展正则表达式
    -i: 原处编辑
 script:
    '地址命令'
地址定界:
    (1) 不给地址:对全文进行处理
    (2) 单地址:
        #: 指定的行
        /pattern/:被此处模式所能够匹配到的每一行
    (3) 地址范围:
#,#
#,+#
/pat1/,/pat2/
#,/pat1/
    (4) ~:步进
        1~2 奇数行
        2~2 偶数行
[root@wzc ~]# sed -n '2p' /etc/passwd
bin:x:1:1:bin:/bin:/sbin/nologin
#打印某行,单引号内数字2,表示第几行
[root@wzc ~]# sed -n '1,$p' /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
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
                  .....
#把/etc/passwd所有行打印出来
[root@wzc ~]# sed -n '1,3p' /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
#也可以指定一个范围
[root@wzc ~]# sed -n '/root/p' /etc/passwd
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
#打印包含某个字符串的行
[root@wzc date]# sed -ne '2p' -e '/root/p' passwd 
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
#-e选项可以实现多点编辑
编辑命令:
    d: 删除模式空间匹配的行
    p: 显示模式空间中的内容
    a \text:在行后面追加文本;支持使用\n实现多行追加
    i \text:在行前面插入文本;支持使用\n实现多行插入
    c \text:替换行为单行或多行文本
    w /path/to/somefile: 保存模式匹配的行至指定文件
    r /path/from/somefile:读取指定文件的文本至模式空
    间中匹配到的行后
    =: 为模式空间中的行打印行号
    !:模式空间中匹配行取反处
[root@wzc date]# cat -n passwd | sed '3d' 
     1  root:x:0:0:root:/root:/bin/bash
     2  bin:x:1:1:bin:/bin:/sbin/nologin
     4  adm:x:3:4:adm:/var/adm:/sbin/nologin
     5  lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
#-d选项删除行,显示删除行以外的行
[root@wzc date]# cat -n passwd |sed '1,3d'
     4  adm:x:3:4:adm:/var/adm:/sbin/nologin
     5  lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
     6  sync:x:5:0:sync:/sbin:/bin/sync
     7  shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
     8  halt:x:7:0:halt:/sbin:/sbin/halt
     9  mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
#-d选项还可以删除指定范围的行
cat -n passwd |grep 'root'|sed '/root/d'
#删除指定的字符串
s///:查找替换,支持使用其它分隔符, s@@@, s###
    替换标记:
        g: 行内全局替换
p: 显示替换成功的行
w /PATH/TO/SOMEFILE:将替换成功的行保存至文件中
[root@wzc ~]# cat test 
root root root
root    root
root root 
[root@wzc ~]# sed 's/root/tot/' test 
tot root root
tot     root
tot root 
[root@wzc ~]# sed 's/root/tot/g' test 
tot tot tot
tot     tot
tot tot 
#‘s’有替换和删除的意思,加‘g’选项是文本行中全局替换,如果不加‘g’选项只替换每行的第一个字符
[root@wzc date]# cat stu.txt 
ID      Name    PHP     Linux   Mysql   Average
1       cangls  88      90      95      91
2       boduo   87      95      90      90.7
3       longze  85      88      87      86.7
[root@wzc date]# sed '3s/95/100/g' stu.txt 
ID      Name    PHP     Linux   Mysql   Average
1       cangls  88      90      95      91
2       boduo   87      100     90      90.7
3       longze  85      88      87      86.7
#把第三行Linux成绩95替换成100,文件内容实际上Linux成绩还是95

[root@wzc date]# sed -i '3s/95/100/g' stu.txt 
[root@wzc date]# cat stu.txt 
ID      Name    PHP     Linux   Mysql   Average
1       cangls  88      90      95      91
2       boduo   87      100     90      90.7
3       longze  85      88      87      86.7
#-i选项是把数据直接写入文件
[root@wzc date]# cat stu.txt 
ID      Name    PHP     Linux   Mysql   Average
1       cangls  88      90      95      91
2       boduo   87      100     90      90.7
3       longze  85      88      87      86.7
[root@wzc date]# sed -e 's/cangls//g' -e 's/boduo//g' stu.txt 
ID      Name    PHP     Linux   Mysql   Average
1               88      90      95      91
2               87      100     90      90.7
3       longze  85      88      87      86.7
#-e前面已经讲过是可以实现多点编辑,同时把‘cangls’和‘boduo’替换为空

Vim
什么是Vim
    Vim是一个功能强大的全屏幕文本编辑器,是Linux/Unix上最常用的文本编辑器,它的作用是建立、编辑、显示文本文件。
    Vim的三种模式:命令模式、插入模式、扩展模式。
模式转换
    命令模式 --> 插入模式
    i: insert, 在光标所在处输入
    I:在当前光标所在行的行首输入
    a: append, 在光标所在处后面输入
    A:在当前光标所在行的行尾输入
    o: 在当前光标所在行的下方打开一个新行
    O:在当前光标所在行的上方打开一个新行
插入模式 ----> 命令模式
    ESC
命令模式 ----> 扩展模式
    :
扩展模式 ----> 命令模式
    ESC
锁定和解锁:CTRL+s,Ctrl+q
关闭文件
扩展模式:
    :q 退出
    :q! 强制退出,丢弃做出的修改
    :wq 保存退出
    :x 保存退出
命令模式
    ZZ: 保存退出
    ZQ:不保存退出

Vim总结(表格)

命令模式下移动光标
h或向左方向键 光标向左移动一个字符
l或向右方向键 光标向右移动一个字符
j或向下方向键 光标向下移动一个字符
k或向上方向键 光标向上移动一个字符
Ctrl+f或者page UP键 屏幕向前移动一页
Ctrl+b或者page DOWN键 屏幕向后移动一页
Ctrl+d 屏幕向前移动半页
Ctrl+u 屏幕向后移动半页
+ 光标移动到非空格符的下一列
光标移动到非空格符的上一列
N空格(n是数字) 按下数字n然后按空格,则光标向右移动n个字符,如果该行字符数小于n,,则光标继续从下行开始向右移动,一直到n
数字0或Shift+6 移动到本行行首
Shift+4或$ 移动到本行行尾
H 光标移动到当前屏幕的最顶行
M 光标移动到当前屏幕的中央那一行
L 光标移动到当前屏幕的最底行
G 光标移动到文本的最末行
nG(n是数字) 移动到该文本的最n行
gg 移动到该文本的首行
n回车(n是数字) 光标向下移动n行
$ 移至行尾
0 移至行首

命令模式下查找与替换
/word 向光标之后寻找一个字符串名为word的字符串,当找到第一个word后,按‘n’继续搜后一个
?word 向光标之后寻找一个字符串名为word的字符串,当找到第一个word后,按‘n’继续搜前一个
:n1,n2s/word1/word2/g 在n1和n2行间查找word1这个字符串并替换成word2,也可以把‘/’换成‘#’或‘@’
:1,$s/word1/word2/g 从第一行到最末行,查找word1并替换成word2
:1,$s/word1/word2/gc 加上c的作用是,在替换前需要用户确认

命令模式下删除、复制、粘贴
x,X X删除光标所在处字符,X为向前删除一个字符
nx(n位数字) 向后删除n个字符
dd 删除光标所在的那一行
ndd(n位数字) 删除光标所在行的向下n行
d1G 删除光标所在的第一行所有数据
dG 删除光标所在行到末行的所有数据
yy 复制光标所在的那行
nyy 复制从光标所在行起向下n行
p,P p复制的数据从光标下一行粘贴,P则从光标上一行粘贴
y1G 复制光标所在行到第一行的所有数据
yG 复制光标所在行到末行的所有数据
J 将光标所在行与下一行的数据结合成同一行
u 还原过去的操作
D 删除光标所在处到行尾内容
r 取代光标所在处字符
R 从光标所在处开始替换字符,按ESC结束

进入编辑模式
i 在当前字符前插入字符
I 在当前行行首插入字符
a 在当前字符后插入字符
A 在当前行行尾插入字符
o 在当前行下插入新的一行
O 在当前行上插入新在当前行下插入新的一行的一行
r 替换光标所在的字符,只替换一次
R 一直替换光标所在的字符,一直到按下ESC

扩展模式
:w 将编辑过的文本保
:w! 若文本属性为只读时,强制保存
:q 退出Vim
:q! 不管编辑或未编辑都不保存退出
:wq 保存,退出
:e! 将文档还原成最原始状态
ZZ 若文档没有改动,则不存储离开,若文档改动过,则存储后离开,等同于:wq
:w  [filename] 编辑都的文档另存为[filename]
:r  [filename] 在当前光标所在行的下面读入filename文档的内容
:set nu 在每行的行首显示行号
:set nonu 取消行号
n1,n2 w [filename] 将n1到n2的内容另存为filename这个文档
:! command 暂时离开Vim运行某个Linux命令。例如:! ls /home暂时列出/home目录下的文件1,然后会提示按回车回到Vim

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

评论列表(1条)

  • 马哥教育
    马哥教育 2016-08-12 10:07

    文章结构清晰明了,有理论有操作,很用心哦,