目录
认识sed
使用sed
命令格式
常用选项options
地址定界
命令command
sed用法演示
常用选项options演示
地址界定演示
命令command演示
sed高级编辑命令
sed 是一种流编辑器,它一次处理一行内容。处理时,把当前处理的行存储在临时缓冲区中,称为“模式空间”(patternspace ),接着用sed 命令处理缓冲区中的内容,处理完成后,把缓冲区的内容送往屏幕。然后读入下行,执行下一个循环。如果没有使诸如‘D’ 的特殊命令,那会在两个循环之间清空模式空间,但不会清空保留空间。这样不断重复,直到文件末尾。文件内容并没有改变,除非你使用重定向存储输出或-i。
功能:主要用来自动编辑一个或多个文件, 简化对文件的反复操作
sed` `[options] ``'[地址定界] command'` `file``(s)
-n:不输出模式空间内容到屏幕,即不自动打印,只打印匹配到的行
-e:多点编辑,对每行处理时,可以有多个Script
-f:把Script写到文件当中,在执行sed时-f 指定文件路径,如果是多个Script,换行写
-r:支持扩展的正则表达式
-i:直接将处理的结果写入文件
-i.bak:在将处理的结果写入文件之前备份一份
不给地址:对全文进行处理
单地址:
#: 指定的行
/pattern/:被此处模式所能够匹配到的每一行
地址范围:
#,#
#,+#
/pat1/,/pat2/
#,/pat1/
~:步进
sed -n '1~2p' 只打印奇数行 (1~2 从第1行,一次加2行)
sed -n '2~2p' 只打印偶数行
d:删除模式空间匹配的行,并立即启用下一轮循环
p:打印当前模式空间内容,追加到默认输出之后
a:在指定行后面追加文本,支持使用\n实现多行追加
i:在行前面插入文本,支持使用\n实现多行追加
c:替换行为单行或多行文本,支持使用\n实现多行追加
w:保存模式匹配的行至指定文件
r:读取指定文件的文本至模式空间中匹配到的行后
=:为模式空间中的行打印行号
!:模式空间中匹配行取反处理
\l:把下个字符转换成小写。
\L:把replacement字母转换成小写,直到\U或\E出现。
\u:把下个字符转换成大写。
\U:把replacement字母转换成大写,直到\L或\E出现。
\E:停止以\L或\U开始的大小写转换
[root@centos111 test]# cat demo
aaa
bbbb
AABBCCDD
[root@centos111 test]# sed "/aaa/p" demo #匹配到的行会打印一遍,不匹配的行也会打印
aaa
aaa
bbbb
AABBCCDD
//匹配或者不匹配都会打印
[root@centos111 test]# sed -n "/aaa/p" demo#-n不显示没匹配的行
aaa
//仅显示匹配到的行
[root@centos111 test]# sed -e "s/a/A/g" -e "s/b/B/g" demo #-e多点编辑
AAA
BBBB
AABBCCDD
//查找到a替换为大写A,查找到b替换为B
[root@centos111 test]# cat sedscript
s/A/a/g
//这里的规则是将A查找到替换为小写a
[root@centos111 test]# sed -f sedscript demo #-f使用文件进行处理
aaa
bbbb
aaBBCCDD
//即sedscript里面写了一个规则,用这个文件来处理demo
[root@centos111 test]# sed -i.bak "s/a/A/g" demo #-i是直接对文件进行处理
//这里直接处理的源文件,并且将源文件在修改前备份了一份
[root@centos111 test]# cat demo.bak
aaa
bbbb
AABBCCDD
//原文件
[root@centos111 test]# cat demo
AAA
bbbb
AABBCCDD
//修改后的文件
[root@centos111 test]# cat demo
aaa
bbbb
AABBCCDD
[root@centos111 test]# sed -n "p" demo #打印全文
aaa
bbbb
AABBCCDD
[root@centos111 test]# sed "2s/b/B/g" demo #替换第二行的b->B
aaa
BBBB
AABBCCDD
[root@centos111 test]# sed -n "1,2p" demo #打印1,2行
aaa
bbbb
[root@centos111 test]# sed -n "/aaa/,/DD/p" demo
aaa
bbbb
AABBCCDD
[root@centos111 test]# sed -n "2,/DD/p" demo
bbbb
AABBCCDD
//第二行到DD行打印出来
[root@centos111 test]# sed "1~2s/[aA]/E/g" demo
EEE
bbbb
EEBBCCDD
//将奇数行的a和A替换为E
[root@centos111 test]# cat demo
aaa
bbbb
AABBCCDD
[root@centos111 test]# sed "2d" demo
aaa
AABBCCDD
//删除第二行
[root@centos111 test]# sed "2a123" demo
aaa
bbbb
123
AABBCCDD
在第2行后面增加了123
[root@centos111 test]# sed "1i123" demo
123
aaa
bbbb
AABBCCDD
//在第一行前面增加了123
[root@centos111 test]# sed "3c123" demo
aaa
bbbb
123
//替换第三行的内容为123
[root@centos111 test]# sed -n "3w/root/demo3" demo
//将第三行的内容保存到/root/demo3中
[root@centos111 test]# cat /root/demo3
AABBCCDD
//这里查看demo3的内容
[root@centos111 test]# sed "1r/root/demo3" demo
aaa
AABBCCDD
bbbb
AABBCCDD
//读取/root/demo3中的内容到demo文件的第一行后
[root@centos111 test]# sed -n "=" demo
1
2
3
//打印行号
[root@centos111 test]# sed -n '2!p' demo
aaa
AABBCCDD
//打印了第二行的内容
[root@centos111 test]# sed 's@[a-z]@\u&@g' demo
AAA
BBBB
AABBCCDD
//将所有的小写替换为了大写
(1)格式
h:把模式空间中的内容覆盖至保持空间中
H:把模式空间中的内容追加至保持空间中
g:从保持空间取出数据覆盖至模式空间
G:从保持空间取出内容追加至模式空间
x:把模式空间中的内容与保持空间中的内容进行互换
n:读取匹配到的行的下一行覆盖 至模式空间
N:读取匹配到的行的下一行追加 至模式空间
d:删除模式空间中的行
D:删除 当前模式空间开端至\n 的内容(不再传 至标准输出),放弃之后的命令,但是对剩余模式空间重新执行sed
例如:倒序输出文本内容
[root@centos111 test]# cat num
One
Two
Three
[root@centos111 test]# sed '1!G;h;$!d' num
Three
Two
One
其中:
1!G 第一行不执行G命令,从第二行开始执行
$!d 最后一行不删除
总结模式空间与保持空间关系:
保持空间是模式空间一个临时存放数据的缓冲区,协助模式空间进行数据处理
(2)演示
① 显示偶数行
[root@centos111 test]# seq 9 |sed -n 'n;p'
2
4
6
8
② 倒序显示
[root@centos111 test]# seq 9 | sed '1!G;h;$!d'
9
8
7
6
5
4
3
2
1
③ 显示奇数行
[root@centos111 test]# seq 9 | sed 'H;n;d'
1
3
5
7
9
④ 显示最后一行
[root@along ~]# seq 9| sed 'N;D'
9
⑤ 每行之间加空行
[root@centos111 test]# seq 9 | sed 'G'
1
2
3
4
5
6
7
8
9
⑥ 把每行内容替换成空行
[root@centos111 test]# seq 9 | sed "g"
-------------------------------------------
⑦ 确保每一行下面都有一个空行
[root@centos111 test]# seq 9 | sed '/^$/d;G'
1
2
3
4
5
6
7
8
9
(3)实战案例:
假如有一个源码需要我们使用shell脚本来进行安装git,那么我们可以试着用sed来实现
首先创建一个脚本:
vim script.sh
内容如下:
#!/bin/bash
if
[[ $(id -u) -ne 0 ]];
then echo "this script must be run root!!!"
sudo su;fi
echo "this script requires git"
yum install -y git
echo "set selinux to disabled"
setenforce 0
sed -i 's/enforcing/disabled/g' /etc/selinux/config
#这里是进入到selinux中使用sed将enforcing替换为disabled
为该脚本授予执行权限:
[root@centos111 test]# chmod +x script.sh
为了测试我们可以先切换到普通用户:
[user1@centos111 test]$ ./script.sh
this script must be run root!!!
我们信任您已经从系统管理员那里了解了日常注意事项。
总结起来无外乎这三点:
#1) 尊重别人的隐私。
#2) 输入前要先考虑(后果和风险)。
#3) 权力越大,责任越大。
[sudo] user1 的密码:
这里我输完密码后就会自动跳转到root用户下
然后我们在root用户下进行执行
[root@centos111 test]# ./script.sh
this script requires git
//然后这里就会自动下载git
...
安装完成后,我们可以去看看/etc/selinux/config文件是否被修改
可以看到这里selinux已经被修改了,说明我们成功的用sed替换成功了!