sed是一种在线编辑器,它一次处理一行内容。处理时,把当 前处理的行存储在临时缓冲区中,称为“模式空间”(pattern space)(为什么叫模式空间呢:因为 sed(不是所有的行都处理)可以指定仅仅处理哪些行,所以 sed 可以像 grep 一样做模式过滤的 符合模式条件的处理 不符合条件的不予处理 )接着用sed 编辑命令处理缓冲区中的内容,处理完成后,把缓冲区的内容送往屏幕。接着处理下一行,这样不断重复,直到文件末尾。符合模式(模式空间中的模式 每次读取一行 匹配模式 编辑命令)做编辑(到底是删除还是现实还是什么 取决于 sed的编辑命令)Sed 主要用来自动编辑一个或多个文件;简化对文件的反复操作;编写转换程序等
2. 定址
可以通过定址来定位你所希望编辑的行,该地址用数字构成,用逗号分隔的两个行数表示以这两行为起止的行的范围(包括行数表示的那两行)。如 1,3 表示 1,2,3 行,美元符号($)表示最后一行。范围可以通过数据,正则表达式或者二者结合的方式确定
3.Sed 命令格式
调用 sed 命令有两种形式:
sed [options] ‘command’ file(s)
sed [options] -f scriptfile file(s)
下边主要以第一种为例,这里说明下第二种方法:新建文件/mnt/rule
cd /mnt
cat lee ##没有内容
vim rule
/^UUID/p
/^UUID/w /mnt/lee
sed -f rule fstab
cat lee ##多了行以UUID开头的内容
4.sed 对字符的处理
p 显示
d 删除
a 添加
c 替换
w 写入
i 插入
p模式:显示
sed -n '/\:/p' fstab 显示fsatb中:行
sed -n '/UUID$/p' fstab 显示fsatb中UUID结尾行
sed -n '/^UUID/p' fstab 显示fsatb中UUID开始行
sed -n '3,6p' fstab 显示fsatb中3到6行
sed -n '3,6!p' fstab 显示fsatb中除了3-6行的其他行行
不加-n重复显示
实验前复制/etc/fstab到/mnt下,做以下编辑
显示fstab中含:的行
sed -n '/\:/p' fstab
显示fstab中以UUID开头的行以及UUID结尾的行
sed -n '/^UUID/p' fstab
sed -n '/UUID$/p' fstab
显示fstab中2-5行
sed -n '2,5p' fstab
显示fstab中不是4-9行的行
d模式:删除
sed '/^UUID/d' fstab 删除fstab中以UUID开始的行
sed '/UUID$/d' fstab 删除fstab中以UUID结尾的行
sed '1,3d' fstab 删除fstab中1-3行
sed '/UUID/!d' fstab 删除fstab中不是UUID的行
sed '4,6!d' fstab 删除fstab中不是4-6行
删除fstab中以UUID开头的行
sed '/^UUID/d' fstab [-n] -n则不显示输出
sed '/UUID$/d' fstab [-n]
删除不是UUID开头的行
sed '/^UUID/!d' fstab
删除fstab中3-6行
删除fstab中不是3-6行的行
a模式:增加
sed '/^UUID/a \hello' sed fstab 追加hello到fstab以UUID开头的行后
sed '/UUID$/a hello\n world' sed fatab 增加换行
对于file1和file2
追加hello world的到file2符合以test开头的行后中
sed '/^test/a hello world' sed file2
追加两行内容第一行hello 第二行world 到file2中以firefox结尾的行后
sed '/firefox$/a hello\nworld' file2
c模式:改变
sed '/^UUID/c hello' fstab 改变fatab中所有符合以UUID开头的那一行为hello
对于fatab把符合UUID开头的行替换sed-mode-c
sed '/^UUID/c set-mode-c' fstab
w模式:写入
sed ‘/^UUID/w /tmp/fstab.txt’ /etc/fstab (把/etc/fstab 中
UUID 开头的行保存到/tmp/fstab 中)
sed -n‘/^UUID/w /tmp/fstab.txt’ /etc/fstab
sed '/^UUID/=' fstab 显示fstab中以UUID开头的行数和内容,会显示其他不符合条件的行内容
sed -n '/^UUID/=' fstab 显示fstab中以UUID开头的行数,只显示符合条件的行号和内容
sed ‘6r /etc/issue’ /etc/fstab (把/etc/issue 文件内容放置
到/etc/fstab 中的第六行)
sed -e 的用法:将下一个字符串解析为 sed 编辑命令
把/etc/fstab中符合以UUID开头的行保存到/mnt/file1中
sed '/^UUID/w /mnt/file1' /etc/fstab
把/etc/fstab中以#开头的行写入保存到file2中,不显示输出内容
sed -n '/^\#/w /mnt/file2' /etc/fstab
查看/etc/fstab中以UUID开头的行是第几行
sed '/^UUID/=' fstab
sed '/^UUID/=' fstab -n ##-n表示只输出符合条件的行号和内容
把westos中的所有内容放置到file的第4行后
i模式:插入
sed '/^UUID/i hello' sed fstab 把hello插入到fstab以UUID开头的行前
sed '/^UUID/i hello\nworld' sed fstab 把hello插入到fstab以UUID开头的行前下一行插入world
把hello 插入到fstab符合以UUID开头的行前
sed '/^UUID/i hello' fstab
sed -e 将下一个字符串解析为 sed 编辑命令
sed -e '/^linux/d' -e '/redhat$/a HWLLO' -e '/^westos/c WESTOS' westos 删除westos文件中符合以linux开头的行,然后增加HELLO到以redhat结尾的纳一行后,最后改变以westos开头的行为WESTOS
这两条命令是一样的
sed -e '/^linux/d;/redhat$/a HELLO' westos
sed -e '/^linux/d' -e '/redhat$/a HELLO' westos
sed的其他用法1:
文本内容的替换
sed 's/#/\*/g' fstab 把fstab中所有的#替换为*
sed 's/\//+/g' fstab 把fstab中所有的/替换为+
sed 's@/@+@g' fstab 把fstab中所有的/替换为+
sed '2s/:/**/g' passwd 把passwd中第2行的:全部替换为**
sed '3,5s/:/#/g' passwd 把passwd中3-5行内容中的:全部替换为#
sed '/adm/,/lp/s/:/-/g' passwd 把passwd中/adm/开始的行到/lp/开始的行,这两行之间的所有行中的:替换为-
sed 's/:/##/' passwd 把passwd中每行的第一个:替换为##
sed 's/:/##/g' passwd 把passwd中全文的:替换为##
实验说明
把/mnt/fstab中的#全文替换*
sed 's/\#/\*/g' fstab
把fstab中的所有/替换+
sed 's/\/+/g' fstab ==sed 's@/@+@g' fstab 把fstab中所有的/替换为+
把passwd中的第2行中:全部替换@
把passwd中3-5行内容中的:全部替换为#
sed '3,5s/:/#/g' passwd
把passwd中/adm/开始的行到/sync/开始的行,这两行之间的所有行中的:替换为-
sed '/adm/,/sync/s/:/-/g' passwd
把passwd中每行的第一个:替换为##
sed 's/:/#/' passwd
把passwd中全文的:替换为$
sed 's/:/\$/g' passwd
sed的其他用法二:调整输出内容
sed 'G' file 每一行后加以行空格行
sed '$!G' file每一行后加以行空格行除了在最后一行
sed '=' file 每一行都加行号在内容上边
sed '=' file | sed 'N;s/\n//' 每一行都加行号在内容前边
sed -n '$p' file 显示file的最后一行内容
sed ‘G’ file实验效果每一行后加以行空格行
sed ‘$!G’ file实验效果每一行后加以行空格行除了在最后一行
sed ‘=’ file 每一行都加行号在内容上边
sed ‘=’ file | sed ‘N;s/\n//’ 每一行都加行号在内容前边
ed -n ‘$p’ file 显示file的最后一行内容