(一) sed流编辑器
sed 是一种在线的非交互式的编辑器,它一次处理一行内容。
处理时,把当前处理的行存储在临时缓冲区中,称为“模式空间”(pattern space),接着用sed命令处理缓冲区中的内容,处理完成后,把缓冲区的内容送往屏幕。接着处理下一行,这样不断重复,直到文件末尾。文件内容并没有 改变,除非你使用重定向存储输出。sed主要用来自动编辑一个或多个文件;简化对文件的反复操作;编写转换程序等。
sed和grep不一样,不管是否找到指定的模式,它的状态都是0
只有当命令存在语法错误时,sed的退出状态才是非0。
(二)sed 对正则表达式的支持
(三)sed命令的格式
- sed 选项 '动作' 文件名
- sed [options] -f scriptfile file(s) ##scriptfile 为存储命令(动作的文件)
- cat 文件名 | sed 选项 '动作'
选项:
-n :只显示被修改的行的内容
-e :直接在命令列模式上进行 sed 的动作编辑;
-f :直接将 sed 的动作写在一个文件内, -f filename 则可以运行 filename 内的 sed 动作;
-r :sed 的动作支持的是延伸型正规表示法的语法。(默认是基础正规表示法语法)
-i :直接修改读取的文件内容,而不是输出到终端。
动作:
a :在指定行后 新增一行或多行内容
c :替换指定行的内容
d :删除指定行的内容
i :在指定行之前 插入一行或多行内容
s :替换指定内容
p : 打印模式空间的行
(四) sed编辑器的几种用法
4.1 对模式空间的文件内容进行 增 删 改(替换行) 查
删除行内容
1、删除行内容删除第2行的内容
- cat file.txt | sed '2d' 或 sed '2d' file.txt
2、删除第2-5行的内容
- cat file.txt | sed '2,5d' 或 sed '2,5d' file.txt
3、删除第2行到最后一行的内容
- cat file.txt | sed '2,$d' 或 sed '2,$d' file.txt
新增、插入 行内容
1、在第2行后新增内容
- cat file.txt | sed '2a hello world'
2、在第2行前插入内容
- cat file.txt | sed '2i hello world
3、在第2行后新增2行内容
- cat file.txt | sed '2a hello\nworld'
替换行内容
1、把第2行的内容替换为 hello world
- cat file.txt | sed '2c hello world'
2、把第2-5行的内容替换为 hello world
- cat file.txt | sed '2,5c hello world'
3、只显示被修改的行的内容
- cat file.txt | sed -n '2c hello world'
搜索指定内容 '//'
1、搜索含有abc的行
- cat file.txt | sed -n '/abc/p'
2、搜索并删除指定内容
- cat file.txt | sed '/abc/d'
4.2 替换指定内容
替换指定内容 's///' 可 's###' 或 's@@@'
1、默认只替换每行中模式首次匹配的内容
- cat file.txt | sed 's/abc/'替换后的内容'/'
2、g标记可以使sed执行全局替换,i标记是忽略大小写的意思
- cat file.txt | sed 's/abc/'替换后的内容'/gi'
3、g标记可以使sed替换第N次出现的匹配
- sed 's/abc/xxx/2g' file.txt
基本几种用法就是上面例举的。下面以几个实际的例子来看看其他一些在sed中需要特别留意的特殊符号:
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]$