目录
一、sed概述
数据流编辑器,默认不编辑原文件,仅对模式空间中的数据做处理。而后,处理结束后,将模式空间打印至屏幕。
二、sed命令使用格式
1、sed语法
sed [options] 'command' file
2、sed选项
选项 | 选项描述 |
---|---|
-n | 静默模式,不在默认显示模式空间中的内容 |
-i | 直接修改原文件 |
-e | 可以同时执行多个脚本,比如-e SCRIPT -e SCRIPT..... |
-f | 例:sed -f /path/to/script/ file。以选项中指定的脚本文件来处理文本文件 |
-r | 表示使用扩展正则表达式 |
-V或--version | 显示版本信息 |
3、 sed命令
命令 | 命令描述 |
---|---|
a | 新增, a 的后面可以接字串,而这些字串会在新的一行出现(目前的下一行) |
c | 取代, c 的后面可以接字串,这些字串可以取代 n1,n2 之间的行 |
d | 删除,因为是删除啊,所以 d 后面通常不接任何东东 |
i | 插入, i 的后面可以接字串,而这些字串会在新的一行出现(目前的上一行) |
p | 打印,亦即将某个选择的数据印出。通常 p 会与参数 sed -n 一起运行 |
s | 取代,可以直接进行取代的工作哩!通常这个 s 的动作可以搭配正则表达式!例如 1,20s/old/new/g 就是了 |
4、sed元字符集
^ | 匹配行开始,如:/^sed/匹配所有以sed开头的行 |
$ | 匹配行结束,如:/sed$/匹配所有以sed结尾的行 |
. | 匹配一个非换行符的任意字符,如:/s.d/匹配s后接一个任意字符,最后是d |
* | 匹配0个或多个字符,如:/*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个0的行 |
x\{m,\} | 重复字符x,至少m次,如:/0\{5,\}/匹配至少有5个0的行 |
x\{m,n\} | 重复字符x至少m次,不多于n次,如:/0\{5,10\}/匹配5~10个0的行; |
三、sed实例
示例文件如下图所示
1、替换操作
sed 's/file/data/' test.txt
sed -n 's/file/data/p' test.txt #-n选项和p命令一起使用,表示只显示修改过的行
sed '2,20c 替代2-20行之间的数据' test.txt #将2-20行的内容替代为替代2-20行之间的数据
sed -i 's/file/data/g' test.txt #使用选项-i直接修改原文件,命令g全局替换
#一行中从第几处开始替换,可以使用Ng,N代表数字。如下示例:
[root@localhost ~]# echo werwerwer | sed 's/we/11/3g'
werwer11r
2、删除操作
#删除第5行,test.txt文件中第5行为Google
sed '5d' test.txt
如下图,第5行删除
#删除第5至最后一行
sed '5,$d' test.txt
#删除以#开头的行
sed '/^#/d' test.txt
3、新增操作
#在test.txt文件第5行的下面增加一行
sed 5a'jfskfsjajddjsajslajfd' test.txt
#在第5行前面添加数据
sed 5i'qereqqwrdffeqwred' test.txt
#在某一个字符后面添加数据
sed 's/alibab/& mayun/' test.txt
4、数据查找并显示
#查找以IP开头的行,并打印
sed -n '/^IP/p' test.txt
查找从第5行开始到第一个#号开头的所有行
sed -n '5,/^#/p' test.txt
5、多点编辑
#删除1到5行,并将以IP开头的行替换为ipaddr
sed -e '1,5'd -e 's/^IP/ipaddr/g' test.txt
6、从文件读入
#添加一段数据在1.txt中,将1.txt中的数据添加到匹配到的行后面
[root@localhost ~]# echo -e "test\nwww\ntwety\ntest" > 1.txt
test
www
twety
test
#将1.txt文件的内容,读入在alibaba的行后面
[root@localhost ~]# sed '/alibaba/r 1.txt' test.txt
7、写入文件
#将1.txt文件中包含test行的内容,写入在2.txt文件中
[root@localhost ~]# sed '/test/w 2.txt' 1.txt