sed 用法

71 篇文章 0 订阅

 

 

 

     sed是一个流编辑器,通过多种类型转换来修改流经它的的文本。sed不会改变提供给它的源文件,而是把改变后的结果发送到stdout.

     sed中每次处理一行。

      sed的元字符有
    .*
[]
^${}/+?|()
     元字符用法:
    除^外,其他符号在
[]
内如果要匹配自己本身字符要加/,否则是元字符的意义。^在[]内开头表示否定,在[]内的其他地方表示本身字符。

 

     ^ 还可用于匹配一行的开头;$用于匹配一行的结尾。

/^The/      匹配以“The”开头的行

 

/end.$/     匹配以“end.”结尾的行

/^T.*/.$/   匹配以“T”开头以“.”结尾的行

 

 

 

     /dog/匹配所有出现的“dog”

     /t.m/匹配所有先出现t,然后隔一个字符再出现m的字符,如tim,tom等。

 

 

   /(<expresion>

   /(<expresion>

 

 

 

 

/) 括号的分组用法
    /
{1,4/}
 限制次数的用法
    *   前面的字符
0
个或多个
    /+  前面的字符1
个或多个
    &
   在替换域中使用表示整个匹配部分,如s/hat/"&"/,&表示前面两个/之间部分

 

 

[[:alpha:]]匹配任意字母字符,大写或小写
[[:alnum:]]匹配任意字母数字字符,相当于[0-9A-Za-z]
[[:blank:]]匹配空格或制表字符
[[:digit:]]匹配数字,相当于[0-9]
[[:lower:]]相当于[a-z]
[[:upper:]]相当于[A-Z]
[[:print:]]匹配任意可打印字符
[[:punct:]]匹配标点符号
[[:space:]]匹配任意空白字符,包括空格、制表符、NL、FF、VT、CR
sed一些常用选项:
-n  抑制自动输出(用命令p,P输出)
-i  直接修改文件内容

 

        sed的执行流程:
a)开始时,把第一行读入模式空间。
b)把命令逐一应用到模式空间,如果没有其他控制干预,则所有命令执行完后就会到达脚本尾部,这时输出模式空间的内容,然后清除模式空间。
c)读入下一行(永远记住当前行是模式空间中行号最大的那行,特别是用到N命令和控制流程改变时往往很容易搞错下一行是什么),重复b)过程。
上面说的“其他控制干预”包括标号的跳转,D命令。D命令删除模式空间中的第一个/n之前(包括这个/n)的所有内容,保留第一个/n之后的内容,然后返回脚本开始处。(有些死循环导致不能到达脚本最后,死循环中又没有用p,P命令,这时有内容输出是由于一些命令有立刻输出模式空间的功能(如n输出模式空间的内容然后读入下一行而不用返回脚本顶端)。最好还是不要依赖sed的自动输出了,自己显式p吧)

 

 

    典型的sed命令行选项:

 

    替换(s)

替换指令格式如下:sed [address1[,address2]] s/pattern/replacement/[n|g] filename

标志g表示对文本全部行进行操作;标志n表示将要替换第n次 出现的表达式。

sed 's/this/that/' file.txt  把输入文件中每一行第一次出现的this替换为that.  与下句效果等同:

sed 's/this/that/1' file.txt

如果要把第二次出现的this替换为that,把n设置为2即可。


    sed 's/is/IS/g' file.txt      整个文件中出现的每个is都被IS取代

            5s/this/that/           把第五行的this 替换为that,仅对第五行进行这个操作。 

            1,5s/this/that/       1,5表示从第一行到第五行,把第一行到第五行的this 替换为that,仅对第五行进行这个操作。

 

            5,$s/this/that/          $ 把最后五行的this 替换为that

           5,$s/this/that/         !不要对给出的行进行操作, 即不要对最后五行的this 替换为that

 

     也可以指定样式的范围,而不仅是行数的范围,如:

     sed '/^The/s/this/that/'     把所有以The开头的行进行替换。

     sed '/start/,/end/s/index/idx/g'   对从包含start的行到包含end的行之间所有行进行替换操作。

 

 

删除d

sed '1,5d' file.txt    删除文件的前5行

应用来反转约束条件:

sed '1,5!d' file.txt 删除前5行之外的所有行

 

 

打印(p

打印可视为删除的逆操作。但有一个不同,必须指明-n标志,以免向输出端重复打印。

sed -n '1,5p' file.txt 打印前5行

sed -n '/^:/p' file.txt  打印以冒号开头的行


      行的添加(a)、插入(i)、改变(c)      //注意,改变的是整个新行

sed '/start/a/ ' file.txt 在包含start的行后插入一个空白行

  sed '$i/ ' file.txt             在文件的末尾插入一个空白行

sed '/secret/c/DELETED' file.txt  查找单词secret,然后把包含它的整行替换为DELETED。

可以使用{}把多个指令编成一个指令组加以执行。

下面这段脚本 在匹配到关键字的行之前插入一个start行,之后播放一个sed行,然后把这一行本身替换成DELETED。

sed '/secret/{

i/

--start

a/

--end

c/

DELETED

}' file.txt

 

退出(q)


退出即结束sed编辑阶段。

sed '10q' file.txt  p  这个命令发送文件的前10行,完成第10行后,就结束sed编辑阶段。

这个命令可以完成GNU/Linux 中head命令的功能。

   

 

轮换(y)

y指令可以转换文本,可以把一个字符转换为另一个。要提供两个字符集合,第一个是查找集合,第二个是替换集合。

例如下面示例,如果遇到A,就把它替换为a,以此类推。这个示例把所有大写字母转换成小写字母。

sed 'y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/' file.txt

进行转换时,样式和替换字符按照一一对应的关系进行处理,因些,这两个字符串的长度必须相等。

 

行数(=)

 

=用于发送当前的行数。可用于发送匹配给定的查找字符串的行数,或是发送输入文件的行数。

例如,如果想知道哪些行包含了指定的查找样式 ,可用以下脚本:

sed -n '/This/=' file.txt          这个脚本 会发送包含单词This的那些行的行数,即每行的行号。

 

保持样式 空间(h)

 

在sed中,有很多空间(缓冲器),sed命令就在其中进行操作。每一输入行都首先复制到样式空间。样式空间是由sed临时拥有的空间,供sed命令执行。在对样式 空间完成脚本所指定的工作后,这一行就会被 复制输出。

在sed中还有保留空间,可以把样式 空间中的内容 复制到保留空间,然后在晚些时候取回他们。保留空间只是一个临时缓冲器,但在要记录某些行进可能非常有用。

使用保留缓冲器,可以把样式空间中的内容存储到保留缓冲器中,然后直接对样式缓冲器进行操作。下面这个示例演示了发送改变后的和未改变的行。

#表示对sed脚本 的注释,#后的字符都会识别为注释。

sed '{

#store the pattern space to the hold buffer

h

#perform the substitution on the pattern space

s/is/IS/

# append the unaltered line to the pattern sapce

G

}' file.txt

这个脚本发送改变后的行,然后立即发送未改动的行。

 

 

一些有用的sed单行程序:

 

#Emit the first 10 lines of a file(such as 'head')

sed 10q file.txt

 

#Emit a double-spaced version of the file

sed 'G' file.txt

 

#Emit number of lines in input file

sed -n '$=' file.txt

 

#Emit the last line of a file

sed '$!d' file.txt

 

#Emit all lines greater than 30 characters in length

sed -n '/^./{30/}/p' file.txt

 

#Emit all non-blank lines

sed '/^$/d' file.txt

 

#Remove all blank lines at the top of a file

sed '/./,$!d' file.txt

 


 http://blog.163.com/william_djj@126/blog/static/351665012009855101645/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值