一、sed工作流程
sed 是一种在线的、非交互式的编辑器,它一次处理一行内容。
处理时,先把当前处理的行内容存储在临时缓冲区中,称为“模式空间”(pattern space),
之后再用sed命令处理缓冲区中的内容,处理完成后,把缓冲区的内容打印到屏幕。
接着处理下一行,这样不断重复,直到文件末尾。
注意:
模式空间的内容和 AWK 中的 $0 是一样的,处理每行的时候,都会被重新赋值为当前行的内容
文件内容并没有改变,除非你使用重定向存储输出。
Sed主要用来自动编辑一个或多个文件;简化对文件的反复操作;编写转换程序等。
二、命令格式
处理单个文件的命令格式
sed [options] '[匹配模式] sed 的内部命令' file1
处理多个文件的命令格式
sed [options] '[匹配模式] [sed 的内部命令]' file1 file2
options 选项是可选的,没有也行
匹配模式 是可选的用于在文件中每一行进行匹配到模式,模式可以是正则,也可以是文件的行号
内部的命令也是可选的,但是两个单引号是必须的
注:
sed和grep不一样,不管是否找到指定的模式,它的退出状态都是0只有当命令存在语法错误时,sed的退出状态才是非0
三、支持正则表达式
与grep一样,sed在文件中查找模式时也可以使用正则表达式(RE)和各种元字符。
正则表达式是括在斜杠间的模式,用于查找和替换,以下是sed支持的元字符。
使用基本元字符集 ^, $, ., *, [], [^], \< \>,\(\),\{\}
使用扩展元字符集 ?, +, { }, |, ( )
使用扩展元字符的方式:
sed -r
在实际使用的时候,都会加上 -r 参数,即使没有用的扩展正则也不会有任何影响。
四、sed的基本用法
打印
sed -rn '/root/p' file 显示root的行 ^ 匹配root 开头 ^root
p 是 sed 的内部命令,是 打印(输出) 的作用
-n 屏蔽默认输出使用
搜索替换--重点,实际应用多
替换文本中的字符串:
sed 's/book/books/' file
后缀 /g 标记会替换每一行中的所有匹配:
sed 's/book/books/g' file
当需要从第N处匹配开始替换时,可以使用 /ng
echo sksksksksksk | sed 's/sk/SK/2g'
skSKSKSKSKSK
i 是同时忽略大小写
sed -r 's/root/shark/gi ' test
找到含有 test 的进行删除
sed -r ' s/^test/ d ' test
注意:
当在模式匹配中使用其他界定符号时,需要对其进行转义。
其他界定符用在 s 搜索替换时不必转义。
例如:
sed -r 's#root#test#' test
sed -r 's%root%test%' test
sed -r 's|root|test|' test
五、sed扩展
全部删除
sed -r 'd ' test
第 3 行删除
sed -r '3 d ' test
第 1 行到第 3 行删除
sed -r '1,3 d ' test
从含有 root 字符串的行开始匹配,一直删除到 第 5 行
sed -r '/root/,5 d' test
从含有 halt 的行开始删除,并删除此行之后的 2 行,就是总共删除 3 行
sed -r '/halt/,+2 d' test
! 取反,含有 root 的行不删除,其他都删除
sed -r '/root/ !d' test
使用行号除以 2 ,余数是 1 的行删除(每次处理的行号是被除数,第二个数是除数,第一数是 余数)
sed -r '1~2 d' test
sed -n '1~2 p' test #奇数行
sed -n '2~2 p' test #偶数行
六、sed命令
替换命令:s
替换文本中的字符串:
sed 's/root/test/g' test
sed -rn 's/[0-9][0-9]/&.5/ p' test #&代表在查找串中匹配到的所有内容
//把所有查找到的两位数后面都加上 .5
sed -r 's/(test)qwer/\1技能/g' test #()括号分组,一个()就是一组\1,第二个就是\2
//把匹配到的所有test后面的qwer都换成“技能”
追加命令:a
sed -r '$ a 1.1.1.1 www.qianfeng.com' /etc/hosts #在最后添加1.1.1.1 www.qianfeng.com
插入命令:i
sed -r '2i\111' /etc/hosts #把111插入到第二行
修改命令:c
sed -r '2c\111' /etc/hosts #把第二行命令修改为111
七、sed常见命令
删除开头的一个或者多个 空格或者 Tab 键
sed -ri '/^[ \t]*/d' test
YUM 源修改
sudo sed -e s/^#baseurl/baseurl/g \
-e s/^mirrorlist/#mirrorlist/g \
-i /etc/yum.repos.d/CentOS-Base.repo
删除配置文件中//号的注释行
sed -ri '\Y^[ \t]*//Yd' file.conf
删除无内容空行
- 开头和结尾之间什么都没有的行
- 开头和结尾之间有多个空格的行
- 开头和结尾之间有多个 Tab 键的行
sed -ri '/^[ \t]*$/d' file.conf
删除注释行和空行
以下 3 中效果一样
sed -ri '/^[ \t]*#/d; /^[ \t]*$/d' test
sed -ri '/^[ \t]*#|^[ \t]*$/d' test
sed -ri '/^[ \t]*($|#)/d' test
给文件行添加注释
sed -ri '1,5s/^/#/ ' test
sed -r '2,6s/(.*)/#\1/' test
sed中使用外部变量
var=1
sed -r "3a$var1" /etc/hosts
sed -r '$a'"$var1" /etc/hosts
sed -r "\$a $var1" /etc/hosts