语法:
sed [选项] [sed内置命令字符] file
选项
参数选项
|
参数解释
|
---|---|
-n | 取消 sed 的默认输出,常与 sed 内置命令 p 一起使用 |
-i | 直接将修改数据写入文件,一般使用 -i.bak 在修改之前备份 |
-e | 支持多次编辑,不需要管道符 |
-r | 支持扩展正则 |
内置命令符
内置命令字符
|
解释
|
---|---|
a | append 对文本追加,在指定行后面添加一行(多行)内容 |
d | delete 删除匹配行 |
i | insert 表示插入文本,在指定行之前插入一行(多行)内容 |
p | print 打印匹配到的内容,通常和 -n 一起使用 |
s/正则/替换内容/g | 匹配正则内容,然后替换(支持正则),结尾 g 表示全局匹配 |
sed 匹配范围
范围
|
解释
|
---|---|
空地址 | 全文处理 |
单地址 | 指定文件某一行 |
/pattern/ | 被模式匹配到的每一行 |
范围区间 | 10,20 十到二十行, 10,+5 第十行向下5行 |
步长 | 1~2,表示从1开始间隔2个,即1/3/5/7 , 2~2,表示从2开始间隔2个,即2/4/6/8 |
匹配符
|
解释
|
---|---|
^ | 锚定行的开始 如:/^sed/匹配所有以sed开头的行 |
$ | 锚定行的结束 如:/sed$/匹配所有以sed结尾的行 |
. | 匹配一个非换行符的字符 如:/s.d/匹配s后接一个任意字符,然后是d |
* | 匹配零或多个字符 如:/*sed/匹配所有模板是一个或多个空格后紧跟sed的行 |
[] | 匹配一个指定范围内的字符,如/[Ss]ed/匹配sed和Sed |
[^] | 匹配一个不在指定范围内的字符,如:/[^A-RT-Z]ed/匹配不包含A-R和T-Z的一个字母开头,紧跟ed的行 |
(…) | 保存匹配的字符,如s/(love)able/\1rs,loveable被替换成lovers |
& | 保存搜索字符用来替换其他字符,如s/love/&/,love这成love |
< | 锚定单词的开始,如:/\ |
> | 锚定单词的结束,如/love>/匹配包含以love结尾的单词的行 |
x{m} | 重复字符x,m次,如:/0{5}/匹配包含5个o的行 |
x{m,} | 重复字符x,至少m次,如:/o{5,}/匹配至少有5个o的行 |
x{m,n} | 重复字符x,至少m次,不多于n次,如:/o{5,10}/匹配5–10个o的行 |
练习题:
1.替换文件中的 root 为 dong ,只替换一次和替换所有
# 替换一次
sed 's/root/dong/p' pwd.txt -n
# 全部替换
sed 's/root/dong/gp' pwd.txt -n
2.替换前十行 b 开头的用户,改为 D ,且仅仅显示替换后的结果
sed '1,10s/^b/D/p' pwd.txt -n
3.替换前十行 b 开头的用户,改为 D, m 开头的行改为 M ,且仅仅显示替换后的结果
sed -e '1,10s/^b/D/p' -e '1,10s/^m/M/p' pwd.txt -n
4.删除4行后面所有的
# 这里是从第五行一直删到结尾
sed '5,$d' pwd.txt
5.删除从 root 开始到 ftp 之间的行
sed '/^root/,/^ftp/d' pwd.txt
6.将文件中空白字符开头的行添加注释
sed 's/^[[:space:]]/#/p' test.txt -n
# 将空行也添加注释
sed -e 's/^[[:space:]]/#/p' -e 's/^$/#/p' test.txt -n
7.删除文件的空白行和注释行
sed -e '/^$/d' -e '/^#/d' test.txt
sed '/^$/d;/^#/d' test.txt
8.给文件的前三行添加 #
# \1 表示引用前面分组的内容
sed -r '1,3s/(^.)/#\1/' test.txt
9.使用 sed 截取出 ip 地址
ifconfig eth0 | sed '2p' -n | sed 's/.*inet[[:space:]]*//' | sed 's/netmask.*//'
or
ifconfig eth0 | sed '2s/.*inet[[:space:]]*//;s/netmask.*//p' -n
10.找出系统版本
# 命令解析
# .*release[[:space:]]* 匹配到 release 包括后面的空格
# [[:space:]]* 表示多个空格
# ([^.]) 表示匹配除了小数点以外的所有内容,() 括号表示分组,为后面 \1 引用
# .* 表示后面的一个或者多个
# + 表示贪婪匹配,即匹配 . 之前的多个内容
sed -r 's/.*release[[:space:]]*([^.]).*+/\1/p' /etc/centos-release -n