介绍sed
sed是一种流编辑器,它一次处理一行内容,把当前处理的行存储在临时缓冲区中(buffer),称为"模式空间",接着sed命令处理缓冲区中的内容,处理完成后,把缓冲区的内容送往屏幕,执行下一个循环。会在两个循环之间清空模式空间,但不会清空保留空间。这样不断重复,直到文件末尾。除非你使用重定向输出或-i.
sed 不会修改文件,因为它处理的数据都是,缓冲区里面的
sed常用的参数和功能
-n 只输出匹配到的内容
-e 可以写多个匹配的模式,每个模式之间用;分开
-r 支持扩展的正则表达式
-f 将sed的动作写入一个文件中
-i 直接修改原文件的内容
flag 有四种标记
1.数值 表示替换到第几处
2.g 替换所有的匹配
3.p 原先行的内容打印出来
4.d 删除指定的内容
5.c 匹配到的行,替换指定的内容
6.! 匹配内容取反
7.w 替换的内容保存在文件中
测试实验
测试文件的内容:
-n 测试输出匹配的内容:
sed -n '/abc/p' test.txt
-e 测试输出匹配的内容:
sed -n -e '/abc/p' -e '/ABC/p' test.txt
s替换匹配内容
sed 's/abc/BCD/' test.txt 若flag无g则替换第一行第一处匹配的abc替换为BCD
sed 's/abc/BCD/g' test.txt 一行所有的abc都替换为BCD
sed 's/abc/BCD/2' test.txt 一行中第二次出现abc时进行替换
sed '/6$/i\I am a line insert!' test.txt ==在6为结尾的行前插入内容
实例1:
修改/etc/selinux/config 中的SELINUX的值
sed -ri 's/^(SELINUX=).*/\1disabled/' /etc/selinux/config
输出结果:
实例2:
在修改/etc/my.conf 中某行增加内容
sed '/^\[mysqld\]/a\user=root\n passwd=123456' /etc/my.conf
实例3:
用@来代替分隔符
sed -r 's@(socket=).*@\1/tmp/mysql.sok@' /etc/my.conf
实例4:
SHELL脚本内嵌入二进制可执行程序,
sed "1,/^# END OF THE SCRIPT/d" "$0" > ${prog_name}
# 在SHELL脚本中可以嵌入二进制可执行程序
# 思路:将二进制可执行程序添加到SHELL末尾,运行时再将该二进制可执行程序导出,然后执行导出的二进制程序
# ---------------------------------- Example
# 先准备SHELL脚本
[root@localhost ~]# cat test.sh
#!/bin/sh
prog_name="./test.exe"
sed "1,/^# END OF THE SCRIPT/d" "$0" > ${prog_name} # 导出二进制程序,这个步骤很重要 ...
chmod u+x ${prog_name}
${prog_name} && rm -f ${prog_name}
# WARNING: Do not modify the following !!!
exit 0
# END OF THE SCRIPT ----------> 这是shell 脚本当前的最后一行
# -------------------------------
# 将二进制可执行程序 /bin/date 嵌入到该脚本中
[root@localhost ~]# cat /bin/date >> test.sh
# 执行脚本 test.sh, 验证是否输出与 date 命令一致
[root@localhost ~]# ./test.sh
2012年 10月 24日 星期三 16:41:20 CST