一、什么是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条)
文章结构清晰明了,有理论有操作,很用心哦,