Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1062113
  • 博文数量: 239
  • 博客积分: 10
  • 博客等级: 民兵
  • 技术积分: 3618
  • 用 户 组: 普通用户
  • 注册时间: 2012-11-12 13:17
文章分类

全部博文(239)

文章存档

2021年(1)

2016年(1)

2015年(30)

2014年(91)

2013年(116)

分类: LINUX

2014-05-17 11:23:00

sed




0 本文例子使用以下文件
 $pg quote.txt
  The honeysuckle band played all night long for only $90.
  It was an evening of splendid music and company.
  Too bad the disco floor fell through at 23:10.
  The local nurse Miss P.Neave was in attendance.




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浏览输入文件时,缺省从第一行开始,有两种方式定位文本:
    1) 使用行号,可以是一个简单数字,或是一个行号范围。
    2) 使用正则表达式。
                       使用sed在文件中定位文本的方式
             x                    x为一行号,如1
             x,y                  表示行号范围从x到y,如2,5表示从第2行到第5行
             /pattern/            查询包含模式的行。例如/disk/或/[a-z]/
             /pattern/pattern/    查询包含两个模式的行。例如/disk/disks/
             pattern/,x           在给定行号上查询包含模式的行。如/ribbon/,3
             x,/pattern/          通过行号和模式查询匹配行。 3,/vdu/
             x,y!                 查询不包含指定行号x和y的行。1,2!




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




2.3 打印文本 example
$sed -n '2p' quote.txt                           (打印第二行)
$sed -n '$p' quote.txt                           (打印最后一行)
$sed -n '1,3p' quote.txt                         (打印第1~3行)
$sed -n '/Neave/'p quote.txt                     (打印匹配Neave的行)
$sed -n '4,/The/'p quote.txt                     (在第四行匹配模式The,若匹配,则打印)
$sed -n '/\$/'p quote.txt            (匹配元字符$)
$sed -n '1,$'p quote.txt                         (打印整个文件,只需将行范围设为第一行到最后一行1,$. $意为最后一行)
$sed -n '/.*ing/'p quote.txt                     (任意字符:使用模式/.*ing/查询以ing结尾的任意单词)
$sed -n '/music/=' quote.txt                     (打印匹配行的行号)
$sed -n -e '/music/p' -e '/music/=' quote.txt    (打印匹配行的内容和行号)


$sed '=' quote.txt | tail -2                     (显示行数或最大行号)


2.4 创建sed脚本文件 || sed用法


2.4.1附加文本 a\
   $chmod u+x append.sed
   $pg append.sed
   #!/bin/sed -f
   /company/ a\
   Then suddenly it happened.
   运行脚本:$append.sed quote.txt
       第二行以/company/开始,这是附加操作起始位置. a\通知sed这是一个附加操作,首先应插入一个新行。第三行是附加操作
   要加入到拷贝的实际文本。输出显示附加结果。


2.4.2插入文本 i\
   插入命令类似于附加命令,只是在指定行前面插入。和附加命令一样,它也只接受一个地址。
   下面脚本使用行号指定文本插入位置,插入位置在模式或指定行号4之前。脚本如下:
   #!/bin/sed -f
   4 i\
   Utter insert ok.


2.4.3修改文本 c\
   修改命令将在匹配模式空间的指定行用新文本加以替代
      将第一行The honeysuckle band played all night long for only $90替换为The office Dibble band played well。首先要
   匹配第一行的任何部分,可使用模式'/Honeysuckle/'。sed脚本文件为change.sed。内容如下:
   $pg change.sed
   #!/bin/sed -f
   /Honeysuckle/ c\
   The office Dibble band played well.
   像插入动作一样,可以使用行号代替模式,两种方式完成相同的功能。
   #!/bin/sed -f
   3 c\
   The office Dibble band played well.


2.4.4删除文本 d
   sed删除文本格式:[address[,address]]d
   地址可以是行的范围或模式,example as:
   $sed '1d' quote.txt              删除第一行
   $sed '1,3'd quote.txt            删除第一到第三行
   $sed '$d' quote.txt              删除最后一行
   $sed '/Neave/d' quote.txt        删除包含文本'Neave'的行
   $sed '-e/Neave/d' quote.txt      删除包含文本'Neave'的行


2.4.5替换文本 s
   替换命令用替换模式替换指定模式,格式为:[address[,address]] s/pattern-to-find/replacement-pattern/[g p w n]
     s选项 通知sed这是一个替换操作,并查询pattern-to-find,成功后用replacement-pattern替换它。
     替换选项如下:
        g     缺省情况下只替换第一次出现模式,使用g选项替换全局所有出现模式。
        p     缺省sed将所有被替换行写入标准输出,加p选项将使-n选项无效。
       -n     选项不打印输出结果。
        w     文件名使用此选项将输出定向到一个文件。
   example:
   $sed 's/night/NIGHT/' quote.txt                  (替换night为NIGHT(第一个)  )
   $sed 's/\$//' quote.txt                   (替换$符号为空白--即删除$符号)
   $sed 's/The/hehe/g' quote.txt                    (替换所有的The为hehe)
   $sed 's/night/lghti/w sed.out' quote.txt         (替换结果写入文件sed.out)


2.4.6 使用替换文本模式插入 (&)
  如果要附加或修改一个字符串,可以使用(&)命令,&命令保存发现模式以便重新调用它,然后把它放在替换字符串里面。
即先给出一个被替换模式,然后是一个准备附加在第一个模式后的另一个模式,并且后面带有&,这样修改模式将放在匹配模
式之前。例如,sed语句s/nurse/"Hello" &/p 的结果如下:  
   $sed -n 's/nurse/"Hello" &/p' quote.txt
   此句在nurse 之前加上"Hello "
   $sed 's/[0-9][0-9]*/& Passwd/g' ok.txt
   此句在文本ok.txt中,在所有的单个或连续数字后面加上'Passwd'.
   $sed 's/[0-9][0-9][0-9]*/& Passwd/g' ok.txt
   此句在文本ok.txt中,在所有的2个或2个以上连续数字后面加上'Passwd'.




2.4.7 从文件中读文本 r
   $sed '/company/r sedin.txt' quote.txt      (在quote.txt的匹配行后插入文本sedin.txt的内容)


2.4.8 首次匹配后退出 q
   $sed  '/.a.*/q' quote.txt                        (匹配"任意字符后跟字符a,再跟任意字符0次或任意多次",首次匹配后退出)




2.5 使用系统sed
    sed的基本功能,但是在脚本或命令行中使用sed真正要做的是修改或删除文件或字符串中文本。


2.5.1 处理控制字符
    使用sed实现的一个重要功能是在另一个系统中下载的文件中剔除控制字符。
    下面是传送过来的文件(dos.txt)的部分脚本, 必须去除所有可疑字符,以便于帐号所有者使用文件。
    $pg dos.txt
    12332##DISO##45.12^M
    00332##LPSO##23.11^M
    01299##USPD##34.46^M
    进行如下操作:
  1) 用一个空格替换所有的(##)符号。
  2) 除起始域中最前面的0(00)。
    3)  删除行尾控制字符(^M)。
    4)  删除行首数字
    一些系统中,回车符为^@和^L,如果遇到一些怪异的字符,不必担心,只要是在行尾并且全都相同就可以。
    按步执行每一项任务,以保证在进行到下一任务前得到理想结果。使用输入文件dos.txt。
    任务1    删除所有的#字符很容易,可以使用全局替换命令。这里用一个空格替换两个或更多的#符号。
    $sed 's/##*/ /g' dos.txt                 (s -- 替换 ; g -- 所有 )
    12332 DISO 45.12^M
    00332 LPSO 23.11^M
    01299 USPD 34.46^M
    任务2  删除所有行首的0。 ^0*表示行首任意个0。模式s/^0*//g设置替换部分为空,即为删除模式,正是要求所在。
  $sed 's/^0*//g' dos.txt
    12332##DISO##45.12^M
    332##LPSO##23.11^M
    1299##USPD##34.46^M
    任务3    最后去除行尾^M符号,为此需做全局替换。设置替换部分为空。模式为:'s/^m/ /g',注意'^M',这是一个控制字符。
         要产生控制字符(^M),需遵从前面产生F1键同样的处理过程。步骤如下;键入sed s/,然后按住键和v键,释放v键,
         再按住^键,并保持键不动,再释放两个键,最后按键。下面命令去除行尾^M字符。
    $sed 's/^M//g' dos.txt
    以上三步,也可使用一条命令实现:
    $cat dos.txt | sed 's/##*/ /g' |sed 's/^0*//g' |sed 's/^M//g'
    放在脚本里实现如下:
    $pg dos.sed
    #!/bin/sed -f
    ### to call : dos.sed dos.txt
    s/##*/ /g
    s/^0*//g
    s/\^M//g
    #### END


    任务4    删除行首数字
    $sed 's/^[0-9]*//g' dos.txt




2.5.2 处理报文输出
    当从数据库中执行语句输出时,一旦有了输出结果,脚本即可做进一步处理。通常先做一些整理,下面是一个sql查询结果。
   Database     size    date created
   ------------------------------
   gosouth       2244    12/11/97
   trisud        5632    8/9/99


   (2 rows affected)


    为了使用上述输出信息做进一步自动处理,需要知道所存数据库名称,为此需执行以下操作:
   1) 使用s/-*//g删除横线------。
   2) 使用/^$/d删除空行。                  (注意空行表示为^$)
   3) 使用$d删除最后一行
   4) 使用1d删除第一行。
   5) 使用awk {print $1}打印第一列。
   命令如下,这里使用了cat,并管道传送结果到sed命令。


   $ cat sql.txt | sed 's/-*//g' | sed '/^$/d' | sed '$d' | sed '1d' | awk '{print $1}'
   gosouth
   trisud




2.5.3 从shell向sed传值
    要从命令行中向sed传值,值得注意的是用双引号,否则功能不执行。
    $NAME="It's a go situation"
    $REPLACE="GO"
    $echo $NAME | sed "s/go/$REPLACE/g"
    It's a GO situation


2.5.4 从sed输出中设置shell变量
    从sed输出中设置shell变量是一个简单的替换过程。运用上面的例子,创建shell变量NEW_NAME,保存上述sed例子的输出结果。
    $NAME="It's a go situation"
    $REPLACE="GO"
    $NEW_NAME= 'echo $NAME | sed "s/go/$REPLACE/g"'
    $echo $NEW_NAME
    It's a GO situation






2.6  快速命令
    下面是一些一行命令集。([h]表示空格,[ ]表示tab键)
     's/.$//g'               删除结尾最后一个字符
     's/\.$//g'              删除结尾句点
          '/\.$/d'                             删除以句点结尾行
          '/.$/d'                             删除所有行
          '/^./d'                             删除所有行
     '-e/abcd/d'              删除包含abcd的行
     's/[][][]*/[]/g'                     删除一个以上空格,用一个空格代替
     's/^[][]*//g'                        删除行首空格
     's/\.[][]*/[]/g'                     删除句点后跟两个或更多空格,代之以一个空格
     '/^$/d'                              删除空行  (仅有空格的行不能删除)
     '/^[[:space:]]*$/d'                  删除空行  (包括仅有空格的行)
     's/^.//g'                            删除第一个字符
     's/COL\(...\)//g'                    删除COL及紧跟COL的后三个字母
     's/COL...//g'                     删除COL及紧跟COL的后三个字母
     's/^\///g'                           从路径中删除第一个\
     's/[]/[ ]/g'                         删除所有空格并用tab键替代
     's/^[ ]//g'                          删除行首所有tab键
     's/[ ]*//g'                          删除所有tab键


   example:
   1. 删除路径名第一个\符号
   将当前工作目录返回给sed,删除第一个\:
   $pwd | sed 's/^\///g'
   2. 追加/插入文本
   将"Mr Willis"字串返回给sed并在Mr后而追加"Bruce"。
   $echo "Mr Willis" | sed 's/Mr/& Bruce/g'
   3. 删除首字符
   sed删除字符串"accounts.doc"首字符。
   $echo "accounts.doc" | sed 's/^.//g'
   4. 删除文件扩展名
   sed删除"accounts.doc"文件扩展名。
   $echo "accounts.doc" | sed 's/\....//g'
   5. 增加文件扩展名
   sed附加字符串".doc"到字符串"accounts"。
   $echo "accounts" | sed 's/$/.doc/g'
阅读(921) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~