Chinaunix首页 | 论坛 | 博客
  • 博客访问: 182356
  • 博文数量: 29
  • 博客积分: 2115
  • 博客等级: 大尉
  • 技术积分: 320
  • 用 户 组: 普通用户
  • 注册时间: 2008-04-01 18:15
文章分类

全部博文(29)

文章存档

2013年(1)

2012年(1)

2011年(5)

2010年(18)

2009年(1)

2008年(3)

我的朋友

分类:

2008-08-21 10:46:10

sed 用法介绍

 

sed是一个非交互性文本流编辑器。它编辑文件或标准输入导出的文本拷贝。Sed可以随意编辑小或大的文件,有许多sed命令用来编辑、删除,并允许做这项工作时不在现场。sed一次性处理所有改变,因而变得很有效,对用户来讲,最重要的是节省了时间。

 

这里设计的主要内容有:

抽取域。
匹配正则表达式。
比较域。
增加、附加、替换。
基本的sed命令和一行脚本。

 

       无论命令是什么, sed并不与初始化文件打交道,它操作的只是一个拷贝,然后所有的改动如果没有重定向到一个文件,将输出到屏幕。

       因为sed是一个非交互性编辑器,必须通过行号或正则表达式指定要改变的文本行。

       sed 命令使用两个工作空间来保留修改的行:保留选定行的模式空间和暂时存储行的保留空间。

       sed 子命令的一般格式如下:

[address-range] function[modifiers]

       Sed的语法格式:

sed [  ] Script [ File ... ]

sed [  ] [   Script ] ... [  ScriptFile ] ... [ File ... ]

      

 

 

 

1 sed怎样读取数据

 

sed从文件的一个文本行或从标准输入的几种格式中读取数据,将之拷贝到一个编辑缓冲区,然后读命令行或脚本的第一条命令,并使用这些命令查找模式或定位行号编辑它。重复此过程直到命令结束。

 

2 调用sed

 

调用sed有三种方式:在命令行键入命令;将sed命令插入脚本文件,然后调用sed;将sed命令插入脚本文件,并使sed脚本可执行。

 

使用sed命令行格式为:

代码:

sed [选项] sed命令输入文件。

 

记住在命令行使用sed命令时,实际命令要加单引号。sed也允许加双引号。

 

使用sed脚本文件,格式为:

代码:

sed [选项] -f sed脚本文件输入文件

 

 

要使用第一行具有sed命令解释器的sed脚本文件,其格式为:

代码:

sed脚本文件[选项] 输入文件

 

 

不管是使用shell命令行方式或脚本文件方式,如果没有指定输入文件, sed从标准输入中接受输入,一般是键盘或重定向结果。

 

 

sed选项如下:

n 不打印;sed不写编辑行到标准输出,缺省为打印所有行(编辑和未编辑)。p命令可以用来打印编辑行。

c 下一命令是编辑命令。使用多项编辑时加入此选项。如果只用到一条sed命令,此选项无用,但指定它也没有关系。

f 如果正在调用sed脚本文件,使用此选项。此选项通知sed一个脚本文件支持所有的sed命令,例如:sed -f myscript.sed input_file,这里myscript.sed即为支持sed命令的文件。

 

2.1 保存sed输出

由于不接触初始化文件,如果想要保存改动内容,简单地将所有输出重定向到一个文件即可。下面的例子重定向sed命令的所有输出至文件‘myoutfile’,当对结果很满意时使用这种方法。

代码:

$sed 'some-sed-commands' input-file > myoutfile

 

 

2.2 使用sed在文件中查询文本的方式

sed浏览输入文件时,缺省从第一行开始,有两种方式定位文本:

引用:

1) 使用行号,可以是一个简单数字,或是一个行号范围。

2) 使用正则表达式

 

 

下面是使用sed定位文本的一些方式。

 

代码:

x                          x为一行号,如1

x,y                       表示行号范围从xy,如25表示从第2行到第5

/pattern/                查询包含模式的行。例如/disk//[a-z]/

―――以下部分未实践

/pattern/pattern/   查询包含两个模式的行。例如/disk/disks/

/pattern/,x              在给定行号上查询包含模式的行。如/disk/,3

x,/pattern/ 通过行号和模式查询匹配行。3 . / v d u /

x,y! 查询不包含指定行号xy的行。1 , 2 !

 

 

实例文档如下:

# cat sed_case

ssh host1 'command1'

ssh host1 'command2'

ssh host2 'command3'  ssh  and ssh1 and ssh2

 

*打印文件第一行,sed命令中一般都要包含p命令用来打印。

# sed -n '1p' sed_case

ssh host1 'command1'

     打印文件第13

 

# sed -n '1,3p' sed_case

ssh host1 'command1'

ssh host1 'command2'

ssh host2 'command3'  ssh  and ssh1 and ssh2

 

     查找文件中包含and的行,并打印出来。

sed -n '/\ and/p' sed_case

ssh host2 'command3'  ssh  and ssh1 and ssh2 ssh host1 'command2'

 

2.3 基本sed编辑命令

 

代码:

sed编辑命令

p 打印匹配行

= 显示文件行号

a \ 在定位行号后附加新文本信息

i \ 在定位行号后插入新文本信息

d 删除定位行

c \ 用新文本替换定位文本

s 使用替换模式替换相应模式

r 从另一个文件中读文本

w 写文本到一个文件

q 第一个模式匹配完成后推出或立即推出

l 显示与八进制A S C I I代码等价的控制字符

{ } 在定位行执行的命令组

n 从另一个文件中读文本下一行,并附加在下一行

g 将模式2粘贴到/pattern n/

y 传送字符

n 延续到下一输入行;允许跨行的模式匹配语句

 

 

 

 

sed和正则表达式

 

sed识别任何基本正则表达式和模式及其行匹配规则。记住规则之一是:如果要定位一特殊字符,必须使用( \)屏蔽其特殊含义

 

 

     附加文本

格式

[address]a\
text\
text\
......
text

 

 

# vi add

 

#!/bin/sed -f

/ssh2/ a\

--add for test

 

./add sed_case

ssh host1 'command1'

ssh host1 'command2'

ssh host2 'command3'  ssh  and ssh1 and ssh2

--add for test

 

 

直接使用命令行: sed '/ssh2/a\--add for test' sed_case可以达到类似效果。注意这里的sed没有-n参数。

 

     插入文本:

插入命令类似于附加命令,只是在指定行前面插入。和附加命令一样,它也只接受一个地址。

比如:

 

# sed '/ssh2/i\--add for test' sed_case

ssh host1 'command1'

ssh host1 'command2'

--add for test

ssh host2 'command3'  ssh  and ssh1 and ssh2

 

 

也可以指定行:

代码:

[sam@chenwy sam]$ cat insert.sed

#!/bin/sed -f

4 i\

Utter confusion followed.

 

     修改文本:

 

# sed '/ssh2/c\--add for test' sed_case

ssh host1 'command1'

ssh host1 'command2'

--add for test

 

     删除文本

sed删除文本格式:

代码:

[address[address]] d

 

 

# sed '1d' sed_case

ssh host1 'command2'

ssh host2 'command3'  ssh  and ssh1 and ssh2

 

     替换文本

替换命令用替换模式替换指定模式,格式为:

代码:

[address[address]] s/ pattern-to-find /replacement-pattern/[gpwn]

 

 

g 缺省情况下只替换第一次出现模式,使用g选项替换全局所有出现模式。

p 缺省sed将所有被替换行写入标准输出,加p选项将使- n选项无效。- n选项不打印输出结果。

w 文件名使用此选项将输出定向到一个文件。

 

# sed 's/and/and2/g' sed_case

ssh host1 'command21'

ssh host1 'command22'

ssh host2 'command23'  ssh  and2 ssh1 and2 ssh2

 

将替换结果写入一个文件用w选项

# sed 's/and/and2/gw send.out' sed_case 

ssh host1 'command21'

ssh host1 'command22'

ssh host2 'command23'  ssh  and2 ssh1 and2 ssh2

[root@localhost ~]# cat send.out

ssh host1 'command21'

ssh host1 'command22'

 

 

#  echo '#!/usr/bin/perl' | sed 's=^#!.*perl=#!/usr/local/bin/perl='

#!/usr/local/bin/perl

 

# echo '#!/opt/bin/perl -w' | sed 's=^#!.*perl=#!/usr/local/bin/perl='

#!/usr/local/bin/perl –w

 

这里优先匹配后面的.*

 

 

     从文件中读文本

 

从文件中读文本

处理文件时, sed允许从另一个文件中读文本,并将其文本附加在当前文件。此命令放在模式匹配行后,格式为:

代码:

address r filename

 

sed '/company./r sedex.txt' quote.txt

 

     提取IP地址

 

# ifconfig eth0 | sed -n '/inet addr:/p'

          inet addr:10.50.20.100  Bcast:10.50.20.255  Mask:255.255.255.0

 

 

# ifconfig eth0 | sed -n 's/.*inet addr:\([^ ]*\).*/\1/p'

10.50.20.100

 

 

 

 

 

 
 
 
 
 
 
 
 
建议参考的书籍:sed & awk
 
附:http://phoenix.99tj.net/blog/article.asp?id=19 的参考

sed是一个非交互性性文本编辑器, 它编辑文件或标准输入导出的文件拷贝。标准输入可能是来自键盘、文件重定向、字符串或变量,或者是一个管道文件。sed可以随意编辑小或大的文件,有许多 sed命令用来编辑、删除,并允许做这项工作时不在现场。sed一次性处理所有改变,因而变得很有效,对用户来说,最重要的是节省了时间sed必须通过行号和正则表达式指定要改变的文本行

sed怎样读取数据:
    sed
从文件的一个文本行或从标准输入的几种格式中读取数据,将之拷贝到一个编辑缓冲区,然后读命令行或脚本的第一条命令,并使用这些命令查找模式或定位行号编辑它,重复过程直到命令结束

sed命令的调用:
   
在命令行键入命令;sed命令插入脚本文件,然后调用sed;sed命令插入脚本文件,并使sed脚本可执行
    sed [option] sed
命令 输入文件            在命令行使用sed命令,实际命令要加单引号
    sed [option] -f sed
脚本文件 输入文件     使用sed脚本文件
    sed
脚本文件 [option] 输入文件            第一行具有sed命令解释器的sed脚本文件
    option
如下:
      n
不打印; sed不写编辑行到标准输出,缺省为打印所有行(编辑和未编辑),p命令可以用来打印编辑行
      c
下一命令是编辑命令,使用多项编辑时加入此选项
      f
如果正在调用sed脚本文件,使用此选项,此选项通知sed一个脚本文件支持所用的sed命令,
          sed -f myscript.sed input_file 
这里myscript.sed即为支持sed命令的文件
   
使用重定向文件即可保存sed的输出

使用sed在文本中定位文本的方式:
    x       x
为一行号,比如1
    x,y    
表示行号范围从xy,2,5表示从第2行到第5
    /pattern/   
查询包含模式的行,/disk//[a-z]/
    /pattern/pattern/  
查询包含两个模式的行,/disk/disks/
    /pattern/,x  
在给定行号上查询包含模式的行,/disk/,3
    x,/pattern/ 
通过行号和模式查询匹配行, 3,/disk/
    x,y!    
查询不包含指定行号xy的行

基本sed编辑命令:
    p     
打印匹配行                      c\    用新文本替换定位文本
    =     
显示文件行号                    s     使用替换模式替换相应模式
    a\    
在定位行号后附加新文本信息        r     从另一个文本中读文本
    i\    
在定位行号后插入新文本信息        w     写文本到一个文件
    d     
删除定位行                      q     第一个模式匹配完成后退出或立即退出
    l     
显示与八进制ASCII代码等价的控制字符        y  传送字符
    n     
从另一个文本中读文本下一行,并附加在下一行   {}     在定位行执行的命令组
    g     
将模式2粘贴到/pattern n/

基本sed编程举例:
   
使用p(rint)显示行: sed -n '2p' temp.txt   只显示第2,使用选项n
   
打印范围:  sed -n '1,3p' temp.txt         打印第1行到第3
   
打印模式:  sed -n '/movie/'p temp.txt     打印含movie的行
   
使用模式和行号查询:  sed -n '3,/movie/'p temp.txt   只在第3行查找movie并打印
   
显示整个文件:  sed -n '1,$'p temp.txt      $为最后一行
   
任意字符:  sed -n '/.*ing/'p temp.txt     注意是.*ing,而不是*ing
   
打印行号:  sed -e '/music/=' temp.txt
   
附加文本:(创建sed脚本文件)chmod u+x script.sed,运行时./script.sed temp.txt
        #!/bin/sed -f
        /name1/ a\             #a\
表示此处换行添加文本
        HERE ADD NEW LINE.     #添加的文本内容
   
插入文本: /name1/ a\ 改成 4 i\ 4表示行号,i插入
   
修改文本: /name1/ a\ 改成 /name1/ c\ 将修改整行,c修改
   
删除文本: sed '1d' temp.txt  或者 sed '1,4d' temp.txt
   
替换文本: sed 's/source/OKSTR/' temp.txt     source替换成OKSTR
             sed 's/\$//g' temp.txt             
将文本中所有的$符号全部删除
             sed 's/source/OKSTR/w temp2.txt' temp.txt
将替换后的记录写入文件temp2.txt
   
替换修改字符串: sed 's/source/"ADD BEFORE" &/p' temp.txt
             
结果将在source字符串前面加上"ADD BEFORE",这里的&表示找到的source字符并保存
   
sed结果写入到文件: sed '1,2 w temp2.txt' temp.txt
                     sed '/name/ w temp2.txt' temp.txt
   
从文件中读文本: sed '/name/r temp2.txt' temp.txt
   
在每列最后加文本: sed 's/[0-9]*/& Pass/g' temp.txt
   
shellsed传值: echo $NAME | sed "s/go/$REP/g"   注意需要使用双引号

快速一行命令:
    's/\.$//g'         
删除以句点结尾行
    '-e /abcd/d'      
删除包含abcd的行
    's/[][][]*/[]/g'  
删除一个以上空格,用一个空格代替
    's/^[][]*//g'     
删除行首空格
    's/\.[][]*/[]/g'  
删除句号后跟两个或更多的空格,用一个空格代替
    '/^$/d'           
删除空行
    's/^.//g'         
删除第一个字符,区别  's/\.//g'删除所有的句点
    's/COL/(...\)//g' 
删除紧跟COL的后三个字母
    's/^\///g'        
删除路径中第一个\

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