1、 sed 是一种行/流编辑器,它一次处理一行内容;处理时,把当前处理的行存储在临时缓冲区中,称为“模式空间”(pattern space ),接着用sed 命令处理缓冲区中该行内容,处理完成后,把缓冲区的该行内容送往屏幕,接着处理下一行,这样不断重复,直到文件末尾。文件内容并没有改变,除非你使用重定向存储输出,Sed 可以用来自动编辑一个或多个文件。
2、 sed命令的用法(除非使用-i选项,不改变原文件内容)
1)、用法:sed [option]… 'script' inputfile…
2)、常用选项:
-n:不输出模式空间所有行的自动打印,而脚本命令p打印模式空间中被脚本指定地址的行,又因为sed命令本身就默认输出模式空间所有行的自动打印,所有-n选项和脚本命令p的同时使用就只打印模式空间中被脚本指定地址的行
-e:多点编辑
-f /PATH/TO/SCRIPT_FILE:从指定文件中读取编辑脚本
-r:支持使用扩展正则表达式
-i:原处编辑
例如#sed –i ‘/^U/r /etc/issue’ fi,屏幕无打印显示,但是修改了原文件fi
#sed –i ‘/^U/r /etc/issue’ fi
屏幕无打印显示,修改了原文件fi,但是在当前目录生成了fi原文件备份文件ffi.bak
3)、script(脚本)格式:'地址命令',必须同时包含地址和脚本命令,使用多个脚本命令,中间用;分开
script地址定界:
(1)不给地址:对全文进行处理(默认)
(2)单地址:
#:指定的行
/pattern/:被此处模式所能够匹配到的每一行
(3)地址范围:
#,#:从第#行到第#行
#,+#
/pat1/,/pat2/
#,/pat1/
(4)步进:用符号~表示
1~2 奇数行
2~2 偶数行
script编辑命令/脚本命令:
d: 删除模式空间匹配的行,删除的模式空间处理行不再在屏幕上显示
p: 显示模式空间中的内容
a \text:在行后面追加文本;支持使用\n 实现多行追加
i \text:在行前面插入文本;支持使用\n 实现多行插入
c \text:替换行为单行或多行文本
w /path/to/somefile: 保存模式匹配的行至指定文件
r /path/from/somefile:读取指定文件的文本至模式空间中匹配到的行后
=: 为模式空间中的行打印行号
!: 模式空间中匹配行取反处理
例如#cat /etc/fstab > fi
#sed ‘3d’ fi,屏幕打印显示的fi文件内容的第三行被删除,但是fi文件本身没有改变
#sed –n ‘3d’ fi,屏幕上无打印输出
#sed ‘3,6p’ fi,屏幕打印显示且重复显示3-6行
#sed –n ‘3,6p’ fi,屏幕打印显示3-6行
#sed –n ‘1~2p’ fi,屏幕打印显示奇数行
#sed –n ‘/^U/p’ fi,屏幕打印显示以U开头的行
#sed ‘/^U/a \xxhhjjkk’ fi,屏幕打印显示且以U开头的行后新行追加文本xxhhjjkk
#sed ‘/^U/a \xxhhjjkk\nbbccddee\nrtrt’ fi
屏幕打印显示且以U开头的行后分三行分别追加文本xxhhjjkk、bbccddee、rtrt
#sed ‘/^U/w /testdir/U.txt’ fi
#sed -n ‘/^U/w /testdir/U.txt’ fi, 把文件fi中以U开头的行存入文件/testdir/U.txt
#sed '/^U/=' fi,打印显示fi文件中以U开头的行的行号
#sed '/^U/!=' fi,打印显示fi文件中非以U开头的行的行号
4)、s///:查找替换, 支持使用其它分隔符,例如s@@@ ,s###
替换标记:
g:行内全局替换,如果不加g,则仅仅替代行中第一个模式匹配
p:显示替换成功的行
w /PATH/TO/SOMEFILE:将替换成功的行保存至文件中
ffi文件内容:good good good
xxhhjjkk god god god
例如#sed ‘s/good/god/gp’ ffi,屏幕打印输出结果是:god god god
xxhhjjkk
但是加上-n选项,输出结果就是:god god god
#sed ‘s/good/god/gw /root/fffi’ffi,将替换成功的行保存在文件/root/fffi中
5)、示例:
#sed –n ‘2,/root/p’ /etc/passwd 打印显示第2行到第一个包含有root字符的行
#sed –n –e ‘/^$/p’ –e ‘/^$/=’ file 打印显示空行及相应的行号(不打印白行及相应行号)
#sed ‘/^$/d’ file 打印显示删除所有空行,但是原文件没有改变
#sed –n‘s/root/&superman/p’ /etc/passwd ,第一个root字符串后添加superman
#sed –n‘s/root/superman&/p’ /etc/passwd ,第一个root字符串前添加superman
#sed -e ‘s/dog/cat/’ -e ‘s/hi/lo/’ pets,所有的dog字符串替换成cat字符串,同时
#sed –i.bak ‘s/dog/cat/g’ pets ,修改原文件时备份原文件为pets.bak
3、sed命令的高级编辑命令/高级脚本命令
1)、高级编辑命令:
其中模式空间相当于多工序加工车间,保持空间相当于临时仓储仓库
h: 把模式空间中的内容覆盖至保持空间中
H:把模式空间中的内容追加至保持空间中
g: 从保持空间取出数据覆盖至模式空间
G:从保持空间取出内容追加至模式空间
x: 把模式空间中的内容与保持空间中的内容进行互换
n: 读取匹配到的行的下一行覆盖至模式空间
N:追加匹配到的行的下一行至模式空间
d: 删除模式空间中的行
D:删当前模式空间中的行
2)示例:
#sed -n 'n;p' FILE,只打印显示偶数行(不考虑n选项,起始自动读第一行进入模式空间,然后判断脚本命令n,读取匹配到的第一行的下一行第二行覆盖至模式空间,而后判断脚本命令p,默认打印第一行第二行同时再次打印第二行;接着读取第三行进入模式空间,然后判断脚本命令n,读取匹配到的第三行的下一行第四行覆盖至模式空间,而后判断脚本命令p,默认打印第三行第四行同时再次打印第四行;依次…;考虑n选项,默认打印不再输出,所以只打印输出偶数行)
#sed '1!G;h;$!d' FILE,倒序排列,相当于#tac FILE(第一行不执行G,不是第一行就执行G,然后执行第二条命令h,最后一行不删除,不是最后一行就删除;起始自动读第一行进入模式空间,然后判断因为是第一行所以不执行G,接着执行第二条命令h,把模式空间中的第一行覆盖至保持空间,然后判断因为不是最后一行所以情况模式空间,也就不打印显示第一行;第二行进入模式空间…)
#sed '$!N;$!D' FILE,只留最后两行,相当于#tail -2 FILE
#sed '$!d' FILE, 只留最后一行,相当于#tail -1 FILE
#sed ‘G’ FILE,在每行的后面加一空行
#sed ‘g’ FILE,用空行覆盖每一行
#sed ‘/^$/d;G’ FILE, 删除所有的空行,然后在每行后加一个空行
#sed 'n;d' FILE,打印显示奇数行
#sed -n '1!G;h;$p' FILE,倒序排列,相当于#tac FILE
原创文章,作者:18612763863,如若转载,请注明出处:http://www.178linux.com/31896