Chinaunix首页 | 论坛 | 博客
  • 博客访问: 393913
  • 博文数量: 138
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 1620
  • 用 户 组: 普通用户
  • 注册时间: 2013-03-10 16:55
个人简介

当你比别人优秀一点点,别人会嫉妒你。当你比别人优秀很多,别人会羡慕你。

文章分类

全部博文(138)

文章存档

2016年(2)

2015年(2)

2014年(15)

2013年(119)

我的朋友

分类: LINUX

2013-04-24 10:22:33


当在命令行上执行sed的时候:

        sed  '               '
        或者
        sed -e'               '

        也可以有多个编辑指令,当有多个编辑指令的时候,必须使用-e选项
        sed -e'                -e'               '  -e'               
      指令是从左向右执行


我们也可以写一个脚本文件 使用 -f选项执行

    sed  -f  filename

我们也可以混用 -e  -f 选项,此时的执行仍然是从左到右执行



===============================================================
编辑指令的格式

            地址部分    和        函数部分

    [address1[,address2]function[argument] 


    地址1 和地址2 可以是行数(意思是多少行到多少行),也可以是字符串(意思是首次函数某个字符串的数据行),也可以是两者的混合
    
    1, 如果用字符串表示某一样,这个字符串必须用 //扩起来
    2,字符串可以使用通配符,正则表达式


    10,200               第十行到第二百行

    10,/test/            从第十行到 首次出现test这个字符串的地方

    /test1/,/test2/    从出现test1的行到出现test2的行



    特殊:
    1,使用通配符和正则表达式   /t.*t/表示所有含有两个t为首位的字符串的行    t为开头 .表示任一字符, *表示前面重复任意次,t表示结尾
    2,当没有地址的时候,表示对所有的数据行都执行函数命令
         当只有一个地址参数的时候,表示只有符合的地址才执行函数命令
               1) 10    仅仅操作第十行
                2) /test/仅仅操作出现test的行(所有行,不是首次出现的行



===============================================================
sed的结果默认是输出到 标准输出。如果我们想更改这个,需要在执行sed的时候添加上 -n选项。

sed -n -e'    '

这样 结果的输出 控制权就转移到了编制指令部分(也就是单引号的部分)

================================================================


=============地址部分介绍完了,现在是函数部分,挨个介绍====================

s   表示替换(substitute)文件内字符串

[address1 [,address2]] s /pattern/replacemen/[flag]

s最多和两个地址参数匹配
patrern表示文件中要被替换的字符串
replacement表示要被替换为的字符串,当这个字符串中出现下列特殊字符的时候,有特殊的意义:

1)出现&的时候,他表示前面要替换的pattern字符串
        sed -e's/test/& my car'     
        test 被替换为test my car
2)出现\字符的时候,是转义字符


flag 介绍
1)如果flag为空,那么仅仅替换文件中第一次出现的pattern的地方
2)flag为g的时候,替换全部的pattern
3)当为十进制数字m的时候,替换第m个出现的pattern


4) p的时候,替换第一个pattern,然后把数据输出到标准输出文件
5)w filename 替换第一个pattern,然后把数据输出到文件filename,如果filename文件不存在,创建之
--------------------------------------------------------------------------------------------------------------
c 替换指定范围内的所有行内容为指定内容

[address1 [,address2]]c\要替换为的内容

就是把地址范围内的内容替换为要替换的内容,如果要替换为的内容为多行,那么行之间用\符号隔开

----------------------------------------------------------------------------------------------------------------
d  函数命令

删除 地址范围内的数据行
[address1[,address2]]d

把文件中所有空白行都删掉: sed -e '/^$/d' filename  
        /^$/是正则表达式,空白行
把文件中所有的连续空白行删除为一行
sed -e '/^$/ {
N
/^$/D
}' filename
没明白这个地方!!

--------------------------------------------------------------------------------------------------------------

a 在指定的行下一行添加内容
在第3行下一行添加内容 test

sed -e '3a\test' filename

在所有出现字符串peter的行下一行添加内容test

sed -e '/peter/a\test' filename

   

命令i 格式同 a,不过是在指定行的前一行

---------------------------------------------------------------------------------------------------------------
p  打印输出 地址范围内的内容
 
[address1[,address2]p

 --------------------------------------------------------------------------------------------------------------

y 命令 
[address1 [,address2]] y /abcdefg/1234567/

y后面两个字符串长度必须一样,它会挨个第一个 ,第二个,第三个 字符替换,常用于消息字母转变为大写字母

 ---------------------------------------------------------------------------------------------------------------
! 表示不执行函数参数,就是处理 “除了地址范围内的行”  

sed -e '/test/!d'
意思是出了包含test的行,都删除。也就是取补集的意思


 =============================================================
pattern 区和hold区

sed有两个缓冲区,pattern区和hold区,其工作原理如下:

先读入一行,去掉尾部换行符,存入pattern space,执行编辑命令。
处理完毕,除非加了-n参数,把现在的pattern space打印出来,在后边打印曾去掉的换行符。
把pattern space内容给hold space,把pattern space置空。
接着读下一行,处理下一行。

一种非平凡情况,一个文件仅一行,尾部没换行,sed只打印,不会尾部加换行,但若在尾部又附加了输出,他会再补上那个换行。
---------------------------------------------------------------------------------------------
关于这两个区的使用,有下面几个函数命令
g 把hold区的内容复制到pattern中,pattern区中原来的内容会丢失。
G 把一个换行符和hold区中的内容追加到pattern中。  
                这里,pattern正常情况下一直存着一行的内容,那么这么处理之后,这个pattern中就不只有一行
                了,当pattern内数据处理完毕之后,我们就要把pattern数据给hold区,然后清空pattern区。

h  把pattern的数据复制到hold区,原来hold区中的内容会丢失。
H  把一个换行符和pattern区的内容附加到原来的hold区

x交换pattern区和hold区内容。

下面是这几个命令的几个应用:

sed -e 'G' filename  
    作用是filename文件中的每一行后面添加一个空行(因为默认的hold区内容是空的,那么G只是附加了一个换行符到filename的每一行后面)


sed的执行机理,我刚刚的理解太失偏颇了。
        不管是直接在命令行上执行也好,写一个脚本执行也好。执行的单位是行。也就是说说,会对输入文件的每一行为单位,执行命令行的函数操作或者完整的脚本操作,然后读入下一行。
        sed首先读入文件的第一行,把他放到pattern,然后对他进行处理,执行命令或者执行脚本,当处理完这一行之后,sed会显示pattern中的内容(如果命令是d,删除,内容是空),然后把这一行移除pattern区,然后读取下一行,继续进行处理。结果的输出是一行一行来的,不是把整个输入文件处理完后,输出出来

把文件倒序输出的脚本
2,$G
h
$!d
分析的时候,记住上面的红色部分,一行一行分析即可。《linux命令、编辑器、shell编程实例大全》 杨明华P581分析了



==========================================================================
上面G g H h x这几个命令是调整所操作文件本身的内容位置。
 w r  是操作两个文件

w 把地址范围的内容放到一个文件中保存起来(说白了就是写到一个新的文件中去,这个没啥用,一个内容重定向> 就搞定了)
r  是输出pattern数据之后。立即输出参数文件的内容,这样用于拼凑文件,感觉也没啥用。
=========================================================================


n 命令,读取下一行到pattern,这里我的理解是,把原来的pattern中的那一行顶掉了

这个可以用于 打印文件的奇数/偶数 行

打印偶数行:
   sed  -e 'n' -e 'p' filename


N读取下一行,并添加到pattern,也就是说pattern中有两行。
-------------------------------------------------------------------------------------------------------------------------------

q 退出,表示当满足地址范围的额时候,停止输入pattern 数据,并停止数据输出到标准输出文件。

这可以用于碰到一个特定的行,我们就停止执行。挺好用的,应该

-------------------------------------------------------------------------------------------------------


D 删除pattern内的第一行数据,当pattern中只有一行数据的时候,和d相同

P 打印pattern中第一行数据,








阅读(543) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~