赞
踩
sed 是一种在线的非交互式的编辑器,它一次处理一行内容。
处理时,把当前处理的行存储在临时缓冲区中,称为“模式空间”(pattern space),接着用sed命令处理缓冲区中的内容,处理完成后,把缓冲区的内容送往屏幕。接着处理下一行,这样不断重复,直到文件末尾。文件内容并没有 改变,除非你使用重定向存储输出。sed主要用来自动编辑一个或多个文件;简化对文件的反复操作;编写转换程序等。
sed和grep不一样,不管是否找到指定的模式,它的状态都是0
只有当命令存在语法错误时,sed的退出状态才是非0。
选项:
-n :只显示被修改的行的内容
-e :直接在命令列模式上进行 sed 的动作编辑;
-f :直接将 sed 的动作写在一个文件内, -f filename 则可以运行 filename 内的 sed 动作;
-r :sed 的动作支持的是延伸型正规表示法的语法。(默认是基础正规表示法语法)
-i :直接修改读取的文件内容,而不是输出到终端。
动作:
a :在指定行后 新增一行或多行内容
c :替换指定行的内容
d :删除指定行的内容
i :在指定行之前 插入一行或多行内容
s :替换指定内容
p : 打印模式空间的行
4.1 对模式空间的文件内容进行 增 删 改(替换行) 查
1、删除行内容删除第2行的内容
2、删除第2-5行的内容
3、删除第2行到最后一行的内容
1、在第2行后新增内容
2、在第2行前插入内容
3、在第2行后新增2行内容
1、把第2行的内容替换为 hello world
2、把第2-5行的内容替换为 hello world
3、只显示被修改的行的内容
1、搜索含有abc的行
2、搜索并删除指定内容
4.2 替换指定内容
1、默认只替换每行中模式首次匹配的内容
2、g标记可以使sed执行全局替换,i标记是忽略大小写的意思
3、g标记可以使sed替换第N次出现的匹配
4.3 操作文件内容时候备份原文件,看下面i.bak 多了passwd.bak
- [hujianmei@localhost days_09]$ 操作文件内容时候备份源文件^C
- [hujianmei@localhost days_09]$ ll
- 总用量 20
- -rw-rw-r-- 1 hujianmei hujianmei 216 2月 20 10:24 break1.sh
- -rw-rw-r-- 1 hujianmei hujianmei 385 2月 20 22:16 passwd
- -rw-rw-r-- 1 hujianmei hujianmei 197 2月 20 10:50 print_99.sh
- -rw-rw-r-- 1 hujianmei hujianmei 183 2月 20 11:02 shift01.sh
- -rw-rw-r-- 1 hujianmei hujianmei 92 2月 20 10:53 shift.sh
- [hujianmei@localhost days_09]$ sed -i.bak 's/root/Root/' passwd
- [hujianmei@localhost days_09]$ ll
- 总用量 24
- -rw-rw-r-- 1 hujianmei hujianmei 216 2月 20 10:24 break1.sh
- -rw-rw-r-- 1 hujianmei hujianmei 385 2月 20 22:36 passwd
- -rw-rw-r-- 1 hujianmei hujianmei 385 2月 20 22:16 passwd.bak
- -rw-rw-r-- 1 hujianmei hujianmei 197 2月 20 10:50 print_99.sh
- -rw-rw-r-- 1 hujianmei hujianmei 183 2月 20 11:02 shift01.sh
- -rw-rw-r-- 1 hujianmei hujianmei 92 2月 20 10:53 shift.sh
- [hujianmei@localhost days_09]$ cat passwd
- Root:x:0:0:root:/root:/bin/bash
- bin:x:1:1:bin:/bin:/sbin/nologin
- daemon:x:2:2:daemon:/sbin:/sbin/nologin
- adm:x:3:4:adm:/var/adm:/sbin/nologin
- lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
- sync:x:5:0:sync:/sbin:/bin/sync
- shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
- halt:x:7:0:halt:/sbin:/sbin/halt
- mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
- operator:x:11:0:operator:/Root:/sbin/nologin
- [hujianmei@localhost days_09]$ cat passwd.bak
- root:x:0:0:root:/root:/bin/bash
- bin:x:1:1:bin:/bin:/sbin/nologin
- daemon:x:2:2:daemon:/sbin:/sbin/nologin
- adm:x:3:4:adm:/var/adm:/sbin/nologin
- lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
- sync:x:5:0:sync:/sbin:/bin/sync
- shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
- halt:x:7:0:halt:/sbin:/sbin/halt
- mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
- operator:x:11:0:operator:/root:/sbin/nologin
- [hujianmei@localhost days_09]$
4.4 已匹配字符串标记用 & 表示,在 sed 中 & 指代模式所匹配到的字符串
- [hujianmei@localhost days_09]$ cat>file<<EOF
- > abc 123 abc123 123abc
- > EOF
- [hujianmei@localhost days_09]$ cat file
- abc 123 abc123 123abc
- [hujianmei@localhost days_09]$ &表示模式匹配到的字符串^C
- [hujianmei@localhost days_09]$ sed 's/abc/[&]/g'
- file
- file
-
-
- ^C
- [hujianmei@localhost days_09]$ sed 's/abc/[&]/g' file
- [abc] 123 [abc]123 123[abc]
- [hujianmei@localhost days_09]$
-
4.5 在sed中使用标签匹配字符串
在sed中 \1 \2 \3 指代出现在括号中的部分正则表达式所匹配到的内容,注意是部分哦,部分匹配那么这一整个字符串都会打印出来的哈~ 这个还没理解到
4.6 sed 组合多个表达式
- [hujianmei@localhost days_09]$ sed组合多个表达式^C
- [hujianmei@localhost days_09]$ echo abc 123 |sed -r 's/[a-z]+/xxx/' | sed -r 's/[0-9]+/666/'
- xxx 666
- [hujianmei@localhost days_09]$ echo abc 123 |sed -r 's/[a-z]+/xxx/' ; 's/[0-9]+/666/'
- xxx 123
- bash: s/[0-9]+/666/: 没有那个文件或目录
- [hujianmei@localhost days_09]$ echo abc 123 |sed -r 's/[a-z]+/xxx/ ; s/[0-9]+/666/'
- xxx 666
- [hujianmei@localhost days_09]$
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。