sed流编辑器 (stream deiter),以行为单位的文本处理程序
语法:
sed [options] 'command' testfile
options部分
-n 关闭模式空间输出
-p 打印指定行
-e 支持多处理命令
-i 将修改写入原文件
-r 支持正则表达
-f 导入command脚本
command 部分
'[地址1,地址2] [函数] [参数(标记)]'
地址定位方法 1数字 2正则
数字
十进制
1 单行
1,3 从第一到第三行
2,+4 第二行,及之后的4行
4,~3 从第4行开始,到下一个3的倍数行
2~3 从第2行起,没间隔3行的行
$ 最后一行
1! 除了第1行以外的行
使用示例:
[root@teacher ~]# cat -n /etc/passwd | sed -n '2,+4p'
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
6 sync:x:5:0:sync:/sbin:/bin/sync
-------------------------------------------------------------------
正则——正则必须用 / / 包裹起来
扩展正则需要使用 -r 参数或转义
常用正则表达:
^ 行首
$ 行尾
. 除了换行以外任意单个字符
.* 所有字符
[] 字符组内任一字符
[^] 对字符组内的每个字符取反(不匹配字符组内的每个字符)
^[^] 非字符组内的字符开头的行
[a-Z] 所有大小写字母
[0-9] 数字
\< 单词头,单词一般以空格或特殊字符做分隔,连续的字符串被当做单词
\> 单词尾
扩展正则 ——使用 -r 参数 或 转义
如:
sed -n '/roo\?/p' /etc/passwd
sed -rn '/roo?/p' /etc/passwd
? 零个或一个前导字符
+ 一个或多个前导字符
abc|def 字符串abc或def
a(bc|de)f 字符串abcf或adef
x{m} 字符x出现m次
x{m,} 字符x出现m次以上
x{m,n} 字符出现m次到n次之间
使用示例:
[root@teacher ~]# sed -n '/^root/p' /etc/passwd
root:x:0:0:root:/root:/bin/bash
[root@teacher ~]# cat /etc/hosts | sed -n '/^[1234567890]/p'
127.0.0.1 localhost.localdomain localhost
192.168.100.254 teacher.aixocm.com teacher
[root@teacher ~]# cat /etc/passwd | sed -rn '/ro?t/p'
vcsa:x:69:69:virtual console memory owner:/dev:/sbin/nologin
rpc:x:32:32:Portmapper RPC user:/:/sbin/nologin
[root@teacher ~]# cat /etc/passwd | sed -rn '/roo?t/p'
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
---------------------------------------------------------------
函数
a 后插 c 替换 i 前插 d 删除 w 另存为 p 打印
使用示例:
[root@localhost test]# sed '/localhost4/a myserver10.10 ftp' /etc/hosts
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
myserver10.10 ftp
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
[root@localhost test]# sed '/localhost4/c myserver10.10 ftp' /etc/hosts
myserver10.10 ftp
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
[root@localhost test]# sed -n '/localhost4/w /tmp/haoren.txt' /etc/hosts
[root@localhost test]# cat /tmp/haoren.txt
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
注意:千万不要 >源文件,不然数据全部丢失
要保存结构可以使用 -i 参数,或 >新文件
------------------------------------------------------------------------
替换—— s 字符串替换
语法:‘s/old/new/g’ 最后的字母g表示全部替换
‘s/old/new/3’ 最后的数字3表示替换第三个匹配的字符串
使用示例:
[root@localhost test]# sed -n 's/root/WUWEI/p' /etc/passwd
WUWEI:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/WUWEI:/sbin/nologin
[root@localhost test]# sed -n 's/root/WUWEI/gp' /etc/passwd
WUWEI:x:0:0:WUWEI:/WUWEI:/bin/bash
operator:x:11:0:operator:/WUWEI:/sbin/nologin
[root@localhost test]# sed -n 's/root/WUWEI/2p' /etc/passwd
root:x:0:0:WUWEI:/root:/bin/bash
root@localhost test]# sed -n '1,$s/root/WUWEI/p' /etc/passwd
WUWEI:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/WUWEI:/sbin/nologin
------------------------------------------------------
\( \) 或 -r ( ) 保存被匹配的字符,以备反向引用\N时使用,最多9个标签
& 替换时使用,不定义标签时使用(反向引用)
使用示例:
[root@localhost test]# sed -n 's/\(root\)/\1_WUWEI/p' /etc/passwd
root_WUWEI:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root_WUWEI:/sbin/nologin
[root@localhost test]# sed -rn 's/(root)/\1_WUWEI/p' /etc/passwd
root_WUWEI:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root_WUWEI:/sbin/nologin
[root@localhost test]# sed -rn '1,$s/(wuwei)(.*)(home)(.*)(bash)/\5\2\1\4\3/p' /etc/passwd
bash:x:500:500::/wuwei/wuwei:/bin/home
[root@localhost test]# sed -n 's/root/&_WUWEI/2p' /etc/passwd
root:x:0:0:root_WUWEI:/root:/bin/bash
-------------------------------------------------------
字符一一对应替换—— y
不支持使用 -n p关闭显示空间,在打印
[root@localhost test]# sed 'y/01234567/ABCDEFFG/' /etc/hosts
BCG.A.A.B localhost localhost.localdomain localhostE localhostE.localdomainE
::B localhost localhost.localdomain localhostF localhostF.localdomainF
-------------------------------------------------------
支持多个正则表达—— -e
使用示例:
[root@localhost test]# sed -e 's/localhost/LINUXSEVER/g' -e 's/127/FFFFF/' /etc/hosts
FFFFF.0.0.1 LINUXSEVER LINUXSEVER.localdomain LINUXSEVER4 LINUXSEVER4.localdomain4
::1 LINUXSEVER LINUXSEVER.localdomain LINUXSEVER6 LINUXSEVER6.localdomain6
------------------------------------------------------------
命令组合—— {} 多个命令使用分号: 隔开,相当于 -e 参数
使用示例:
[root@localhost test]# cat /etc/hosts
127.0.0.1 localhost localhost.localdomain SXKEJILINUX SXKEJILINUX.localdomain4
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
[root@localhost test]# sed '{=;s/SXKEJILINUX/localhost4/g;s/localhost/SERVER/g;}' /etc/hosts
1
127.0.0.1 SERVER SERVER.localdomain SERVER4 SERVER4.localdomain4
2
::1 SERVER SERVER.localdomain SERVER6 SERVER6.localdomain6
[root@localhost test]# sed {=;s/SXKEJILINUX/localhost4/g;2!s/localhost/SERVER/g;} ' /etc/hosts
1
127.0.0.1 SERVER SERVER.localdomain SERVER4 SERVER4.localdomain4
2
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
等号 “=” 打印行号
感叹号 “ ! ” 表示取反,2!s/old/new/ 表示除了第2行以外的都进行替换
--------
[root@localhost test]# sed -n '1{=;s/localhost/LINUX/;s/127/99999/p}' /etc/hosts //指定对第一行进行一系列处理
1
99999.0.0.1 LINUX localhost.localdomain SXKEJILINUX SXKEJILINUX.localdomain4
[root@localhost test]# sed -n '/127/{=;s/localhost/LINUX/;s/127/99999/p}' /etc/hosts //正则表达式匹配的行进行处理
1
99999.0.0.1 LINUX localhost.localdomain SXKEJILINUX SXKEJILINUX.localdomain4
--------------------------------------------------------------
将修改直接写入文件 —— -i
使用示例:
[root@localhost test]# ls -i /etc/hosts
1311471 /etc/hosts
[root@localhost test]# sed -i 's/localhost4/SXKEJILINUX/' /etc/hosts
[root@localhost test]# cat /etc/hosts
127.0.0.1 localhost localhost.localdomain SXKEJILINUX localhost4.localdomain4
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
[root@localhost test]# ls -i /etc/hosts
1319270 /etc/hosts
注意:使用-i参数后,相当于生成了新的/etc/hosts文件,inode信息发生了变化
----------------------------------------------------------------
脚本方法—— -f 可以将要做的处理写入脚本,然后在命令行引用该脚本即可。
语法: -f 参数 引用脚本(脚本末尾不能有空格或其它制表符)
使用示例:
[root@localhost test]# cat sxkj.txt
111111111111111
222222222222222
333333333333333
444444444444444
555555555555555
666666666666666
777777777777777
888888888888888
[root@localhost test]# cat rec.sed //脚本内容
2,4d
s/5555*/AAAAAAAAAAAA/
s/777*/BBBBBBBBBBBB/
[root@localhost test]# sed -f rec.sed sxkj.txt
111111111111111
AAAAAAAAAAAA
666666666666666
BBBBBBBBBBBB
888888888888888
语法:
sed [options] 'command' testfile
options部分
-n 关闭模式空间输出
-p 打印指定行
-e 支持多处理命令
-i 将修改写入原文件
-r 支持正则表达
-f 导入command脚本
command 部分
'[地址1,地址2] [函数] [参数(标记)]'
地址定位方法 1数字 2正则
数字
十进制
1 单行
1,3 从第一到第三行
2,+4 第二行,及之后的4行
4,~3 从第4行开始,到下一个3的倍数行
2~3 从第2行起,没间隔3行的行
$ 最后一行
1! 除了第1行以外的行
使用示例:
[root@teacher ~]# cat -n /etc/passwd | sed -n '2,+4p'
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
6 sync:x:5:0:sync:/sbin:/bin/sync
-------------------------------------------------------------------
正则——正则必须用 / / 包裹起来
扩展正则需要使用 -r 参数或转义
常用正则表达:
^ 行首
$ 行尾
. 除了换行以外任意单个字符
.* 所有字符
[] 字符组内任一字符
[^] 对字符组内的每个字符取反(不匹配字符组内的每个字符)
^[^] 非字符组内的字符开头的行
[a-Z] 所有大小写字母
[0-9] 数字
\< 单词头,单词一般以空格或特殊字符做分隔,连续的字符串被当做单词
\> 单词尾
扩展正则 ——使用 -r 参数 或 转义
如:
sed -n '/roo\?/p' /etc/passwd
sed -rn '/roo?/p' /etc/passwd
? 零个或一个前导字符
+ 一个或多个前导字符
abc|def 字符串abc或def
a(bc|de)f 字符串abcf或adef
x{m} 字符x出现m次
x{m,} 字符x出现m次以上
x{m,n} 字符出现m次到n次之间
使用示例:
[root@teacher ~]# sed -n '/^root/p' /etc/passwd
root:x:0:0:root:/root:/bin/bash
[root@teacher ~]# cat /etc/hosts | sed -n '/^[1234567890]/p'
127.0.0.1 localhost.localdomain localhost
192.168.100.254 teacher.aixocm.com teacher
[root@teacher ~]# cat /etc/passwd | sed -rn '/ro?t/p'
vcsa:x:69:69:virtual console memory owner:/dev:/sbin/nologin
rpc:x:32:32:Portmapper RPC user:/:/sbin/nologin
[root@teacher ~]# cat /etc/passwd | sed -rn '/roo?t/p'
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
---------------------------------------------------------------
函数
a 后插 c 替换 i 前插 d 删除 w 另存为 p 打印
使用示例:
[root@localhost test]# sed '/localhost4/a myserver10.10 ftp' /etc/hosts
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
myserver10.10 ftp
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
[root@localhost test]# sed '/localhost4/c myserver10.10 ftp' /etc/hosts
myserver10.10 ftp
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
[root@localhost test]# sed -n '/localhost4/w /tmp/haoren.txt' /etc/hosts
[root@localhost test]# cat /tmp/haoren.txt
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
注意:千万不要 >源文件,不然数据全部丢失
要保存结构可以使用 -i 参数,或 >新文件
------------------------------------------------------------------------
替换—— s 字符串替换
语法:‘s/old/new/g’ 最后的字母g表示全部替换
‘s/old/new/3’ 最后的数字3表示替换第三个匹配的字符串
使用示例:
[root@localhost test]# sed -n 's/root/WUWEI/p' /etc/passwd
WUWEI:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/WUWEI:/sbin/nologin
[root@localhost test]# sed -n 's/root/WUWEI/gp' /etc/passwd
WUWEI:x:0:0:WUWEI:/WUWEI:/bin/bash
operator:x:11:0:operator:/WUWEI:/sbin/nologin
[root@localhost test]# sed -n 's/root/WUWEI/2p' /etc/passwd
root:x:0:0:WUWEI:/root:/bin/bash
root@localhost test]# sed -n '1,$s/root/WUWEI/p' /etc/passwd
WUWEI:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/WUWEI:/sbin/nologin
------------------------------------------------------
\( \) 或 -r ( ) 保存被匹配的字符,以备反向引用\N时使用,最多9个标签
& 替换时使用,不定义标签时使用(反向引用)
使用示例:
[root@localhost test]# sed -n 's/\(root\)/\1_WUWEI/p' /etc/passwd
root_WUWEI:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root_WUWEI:/sbin/nologin
[root@localhost test]# sed -rn 's/(root)/\1_WUWEI/p' /etc/passwd
root_WUWEI:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root_WUWEI:/sbin/nologin
[root@localhost test]# sed -rn '1,$s/(wuwei)(.*)(home)(.*)(bash)/\5\2\1\4\3/p' /etc/passwd
bash:x:500:500::/wuwei/wuwei:/bin/home
[root@localhost test]# sed -n 's/root/&_WUWEI/2p' /etc/passwd
root:x:0:0:root_WUWEI:/root:/bin/bash
-------------------------------------------------------
字符一一对应替换—— y
不支持使用 -n p关闭显示空间,在打印
[root@localhost test]# sed 'y/01234567/ABCDEFFG/' /etc/hosts
BCG.A.A.B localhost localhost.localdomain localhostE localhostE.localdomainE
::B localhost localhost.localdomain localhostF localhostF.localdomainF
-------------------------------------------------------
支持多个正则表达—— -e
使用示例:
[root@localhost test]# sed -e 's/localhost/LINUXSEVER/g' -e 's/127/FFFFF/' /etc/hosts
FFFFF.0.0.1 LINUXSEVER LINUXSEVER.localdomain LINUXSEVER4 LINUXSEVER4.localdomain4
::1 LINUXSEVER LINUXSEVER.localdomain LINUXSEVER6 LINUXSEVER6.localdomain6
------------------------------------------------------------
命令组合—— {} 多个命令使用分号: 隔开,相当于 -e 参数
使用示例:
[root@localhost test]# cat /etc/hosts
127.0.0.1 localhost localhost.localdomain SXKEJILINUX SXKEJILINUX.localdomain4
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
[root@localhost test]# sed '{=;s/SXKEJILINUX/localhost4/g;s/localhost/SERVER/g;}' /etc/hosts
1
127.0.0.1 SERVER SERVER.localdomain SERVER4 SERVER4.localdomain4
2
::1 SERVER SERVER.localdomain SERVER6 SERVER6.localdomain6
[root@localhost test]# sed {=;s/SXKEJILINUX/localhost4/g;2!s/localhost/SERVER/g;} ' /etc/hosts
1
127.0.0.1 SERVER SERVER.localdomain SERVER4 SERVER4.localdomain4
2
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
等号 “=” 打印行号
感叹号 “ ! ” 表示取反,2!s/old/new/ 表示除了第2行以外的都进行替换
--------
[root@localhost test]# sed -n '1{=;s/localhost/LINUX/;s/127/99999/p}' /etc/hosts //指定对第一行进行一系列处理
1
99999.0.0.1 LINUX localhost.localdomain SXKEJILINUX SXKEJILINUX.localdomain4
[root@localhost test]# sed -n '/127/{=;s/localhost/LINUX/;s/127/99999/p}' /etc/hosts //正则表达式匹配的行进行处理
1
99999.0.0.1 LINUX localhost.localdomain SXKEJILINUX SXKEJILINUX.localdomain4
--------------------------------------------------------------
将修改直接写入文件 —— -i
使用示例:
[root@localhost test]# ls -i /etc/hosts
1311471 /etc/hosts
[root@localhost test]# sed -i 's/localhost4/SXKEJILINUX/' /etc/hosts
[root@localhost test]# cat /etc/hosts
127.0.0.1 localhost localhost.localdomain SXKEJILINUX localhost4.localdomain4
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
[root@localhost test]# ls -i /etc/hosts
1319270 /etc/hosts
注意:使用-i参数后,相当于生成了新的/etc/hosts文件,inode信息发生了变化
----------------------------------------------------------------
脚本方法—— -f 可以将要做的处理写入脚本,然后在命令行引用该脚本即可。
语法: -f 参数 引用脚本(脚本末尾不能有空格或其它制表符)
使用示例:
[root@localhost test]# cat sxkj.txt
111111111111111
222222222222222
333333333333333
444444444444444
555555555555555
666666666666666
777777777777777
888888888888888
[root@localhost test]# cat rec.sed //脚本内容
2,4d
s/5555*/AAAAAAAAAAAA/
s/777*/BBBBBBBBBBBB/
[root@localhost test]# sed -f rec.sed sxkj.txt
111111111111111
AAAAAAAAAAAA
666666666666666
BBBBBBBBBBBB
888888888888888
转载于:https://blog.51cto.com/wuwei5460/1112869