如果没有使诸如‘D’的特殊命令,那会在两个循环之间清空模式空间,但不会清空保留空间。这样不断重复,
直到文件末尾。文件内容并没有改变,除非你使用重定向存储输出。没有使用w选项的话,所有的改变只保留在默认输出
上(屏幕),原文件内并不做任何改动.
功能:主要用来自动编辑一个或多个文件,简化对文件的反复操作,编写转换程序等
用法:
sed [option]... ‘script‘ inputfile...
sed+选项+地址命令+输入文件(可以为多个),其中地址命令可以省略,直接sed+输入文件效果类似于cat。
常用选项:
-n:不输出模式空间内容到屏幕,即不自动打印,但是后面可以跟#p来指定打印第几行
p: 打印 ,直接sed + ‘p‘ + 文件的话,会把指定文件打印两次.因为sed默认就是输出,p又指定打印一次.
而sed + #p + 文件的话,则会将指定行打印2次,其余行打印一次.
-e: 多点编辑,即可以指定多个规则.
-f:/PATH/SCRIPT_FILE: 从指定文件中读取编辑脚本
-r: 支持使用扩展正则表达式
-i.bak: 备份文件并原处编辑,只有加了i,所有的设置才会在原文件中生效.加上-i.bak后,会自动创建出
以原名件名.bak的备份文件,原文件内容被替换,但备份文件内容与被修改前一样.(.bak可以改成任意字符串)
script:‘地址命令’
地址定界:
(1) 不给地址:对全文进行处理
(2) 单地址:
#: 指定的行,$:最后一行
/pattern/:被此处模式所能够匹配到的每一行.
(3) 地址范围:
#,#
#,+#
/pat1/,/pat2/
#,/pat1/
(4) ~:步进
1~2 奇数行
2~2 偶数行
编辑命令:
p:打印当前模式空间内容,追加到默认输出之后,使用p的时候要把-n加上,否则会输出两遍。
d: 删除模式空间匹配的行,并立即启用下一轮循环
a []text:在指定行后面追加文本,支持使用\n实现多行追加
i []text:在行前面插入文本,和a相反.
c []text:替换行为单行或多行文本
w /path/somefile: 保存模式匹配的行至指定文件
r /path/somefile:读取指定文件的文本至模式空间中
注意:不指定位置的话,追加方式为逐行追加(即在123的每一行下方,都追加一次全部的321内容.包括空行).
匹配到的行后
=: 为模式空间中的行打印行号
!:模式空间中匹配行取反处理
sed工具
s///:查找替换,支持使用其它分隔符,s@@@,s###
替换标记:
g: 行内全局替换 s/替换内容/g,如果想忽略大小写,可以在g后面加上i,变为s/替换内容/gi即可.
替换一行中的某一部分.
格式:sed ‘s/要替换的字符串/新的字符串/g‘ (要替换的字符串可以用正则表达式)
替换匹配行中的某个字符串
格式sed -i ‘/匹配字符串/s/匹配字符串/替换目标字符串/g‘ filename
p: 显示替换成功的行
w /PATH/TO/SOMEFILE:将替换成功的行保存至文件中
例子:
第二行打印2次,其余行打印一次.
只打印第二行.
只打印1--4行.
只打印包含root的行.
从2行开始,只打印包含root的行.
显示空行行号
先打印所有空行,并把空行打上行号.
将/etc/passwd文件中,所有root的行后,追加一行内容为superman的行.
将/etc/passwd文件中,所有root的行前,追加一行内容为superman的行.
将/etc/passwd文件中,所有root的行,替换内容为superman的行.
删除所有空行.
删除第一行到第十行.
删除第二到第五行
在第二行后追加一行,内容为 tea(没有空格)
将example文件当中,所有的test替换为mytest。
将passwd文件中,root单词后方加上superman。,变为rootsuperman.
将passwd文件中,root单词前方加上superman。,变为supermanroot.
将pets中的dog换成cat,再将hi换成lo.
sed高级编辑.sed有模式空间(临时缓存区)及保持空间(相当于仓库).
Pattern Space相当于车间,sed把流内容在这里进行处理,Hold Space相当于仓库,加工的半成品在这里进行临时
存储基于用户希望在某个条件下脚本中的某个命令被执行,或者希望模式空间得到保存以便下一次处理都有可能使得
sed在处理文件的时候不按照正常的流程来进行,这个时候,sed设置了一些高级命令来满足用户的要求。
P:打印模式空间开端至\n内容,并追加到默认输出之前.
h: 把模式空间中的内容覆盖至保持空间中
H:把模式空间中的内容追加至保持空间中
g: 从保持空间取出数据覆盖至模式空间
G:从保持空间取出内容追加至模式空间
x: 把模式空间中的内容与保持空间中的内容进行互换
n: 读取匹配到的行的下一行至模式空间,用下一个命令处理新的行而不是用第一个命令
N:读取匹配到的行的下一行追加至模式空间,并在两者之间嵌入一个新行,改变当前行号.
d: 删除模式空间中的行
D:如果模式空间包含换行符,则删除直到第一个换行符的模式空间中的文本,并不会读取新的输
入行,而使用合成的模式空间重新启动循环。如果模式空间不包含换行符,则会像发出d命令那样
启动正常的新循环
sed-n ‘n;p‘ FILE
先读入文件的第一行至模式空间,执行n命令(读取下一行并覆盖模式空间),再执行命名p(打印至屏幕)
所以最终结果是只打印了偶数行。和 sed -n 2~2p 一样了。
sed ‘1!G;h;$!d‘ FILE
!为非的意思,1!G的意思是,第一行不执行G命令,执行h命令,把模式空间的内容覆盖至保持空间,接下来执行d命令,
删除模式空间的内容,$!d的意思是,最后一行不执行删除.所以这时保持空间当中只有第一行内容。
接着第二行开始执行.读入第二行,执行G命令后,模式空间和保持空间都有第二行的内容,接下来执行h命令,把模式空间
的内容覆盖至保持空间.再开始执性d命令删除模式空间内容,这时保持空间内容为第二行及第一行.
依次类推,直到执行完后,保持空间的内容相对于原文件而言,已经是倒序了.也就是 sed ‘1!G;h;$!d‘=tac(倒序)
sed ‘N;D‘ FILE
N一次读入两行至模式空间(a行和b行),并删除上一行内容(a行),D如果当前模式空间内有换行符,则删除上一行内容,
然后使用删除后的模式空间内容(b行),接着再次读入一行(c行).再开始删除上一行(b行),再使用删除后的模式空间(c行)
读取下一行...直至读完整个文本,输出模式空间内容至屏幕上.这时只会打印最后一行.也就是sed ‘N;D‘ =tail -1.
sed ‘$!N;$!D‘ FILE
$!N不是最后一行就读取两行.$!D不是最后一行就删除模式空间的上一行.直到最后一行时不再删除模式空间的上一行
并将模式空间内容打印至屏幕上,相当于只打印后两行内容.也即是sed ‘$!N;$!D‘=tail -2
sed ‘$!d‘ FILE
不是最后一行就删除,相当于只要最后一行.也就是 sed ‘$!d‘ = sed ‘N;D‘ = tail -1.
sed ‘G’ FILE
从保持空间拉取内容追加至保持空间,而最开始保持空间内容为0.相当于在原文件每行下面添加了一个空白行.
sed ‘g’ FILE
从保持空间取出数据覆盖至模式空间,而最开始保持空间内容为0.相当于原文件全被变成空白行了.(但总行数不变)
sed ‘/^$/d;G’ FILE
删除空白行,再从保持空间拉取内容追加至保持空间,而最开始保持空间内容为0.相当于在原文件每行下面添加了
一个空白行.但和直接的G不同,这个命令会将所有的空白行全部删除,只在非空白行下面追加一个空白行.
sed ‘n;d‘ FILE
读取下一行内容至模式空间,然后执行d命令删除,相当于隔行保留.也就是 sed ‘n;d‘ = sed -n 1~2p
sed -n ‘1!G;h;$p‘ FILE
!为非的意思,1!G的意思是,第一行不执行G命令,执行h命令,把模式空间的内容覆盖至保持空间,接下来执行p命令,
$p的意思是,最后一行打印.这时候不打印.
接着第二行开始执行.读入第二行,执行G命令后,模式空间和保持空间都有第二行的内容,接下来执行h命令,把模式空间
的内容覆盖至保持空间.再开始执行$p命令,依然不打印.这时保持空间内容是第二行,第一行。依次类推,直到执行至
最后一行全部打印.相当于倒序.也就是:sed ‘1!G;h;$!d‘=tac(倒序) = sed -n ‘1!G;h;$p‘
原文:http://blog.51cto.com/13477118/2125287