导航:[首页]->[bash]->[sed学习笔记]

概述

Sed 命令列可分成编辑指令与文件档部份。 编辑指令负责控制所有的编辑工作; 文件档表示所处理的档案。sed 的编辑指令均由位址(address)与函数(function)两部份组成,在执行时,sed利用它的位址参数来决定编辑的对象;而用它的函数参数编辑。

sed 编辑指令 , 除了可在命令列上执行 , 也可在档案内执行。其中差别只是在命令列上执行时 , 其前必须加上选项 -e ; 而在文件内时 , 则只需在其文件名前加上选项 -f。另外 , sed 执行编辑指令是依照它们在命令列上或档内的次序。

    sed -e '编辑指令1' -e '编辑指令2' ... 文件档
    cat doc | sed -e '1,10d' -e 's/yellow/black/g'
    sed -e '1,10d' -e 's/yellow/black/g' yel.dat

pattern space&hold space

  1. pattern space(模式空间)相当于车间sed把流内容在这里处理;
  2. hold space(保留空间)相当于仓库,加工的半成品在这里临时储存(当然加工完的成品也在这里存储)。

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

pattern spaces初始为空,直到匹配第一行。

位址

位址参数表示法要编辑的资料行 , 用它们的行数或其中的字串来代替表示它们。

位址为十进位数字 : 此数字表示行数。当指令执行时 , 将对符合此行数的资料执行函数参数指示的编辑动作。例如 ,删除文件中的第 15 行 , 则指令为 15d。

位址为 正则表达式 :当资料行中有符合正则表达式所表示的字串时 , 则执行函数参数指示的编辑动作。另外 , 在正则表达式前后必须加上 "/"。例如指令为 /t.*t/d , 表示删除所有含两 "t" 字母的资料行。

位址选项

  1. NULL:若不存在,将匹配所有行
  2. N:匹配特定行N,例如sed -e 1d
  3. M,N:匹配M行到N行(包括第M和N行),例如sed -e 1,3d
  4. M~N: 从M行开始(包括第M行),每N行匹配,例如sed -e 2~2d将删除2、4、6...行。
  5. M,+N: 从M行开始(包括第M行),匹配N行,也就是一共会匹配N+1
  6. M,~N: 从M行开始(包括第M行),一直匹配到X(包括第X行),其中X是M的整数倍。例如sed -e 5,~4d将删除5、6、7、8行。
  7. /regexp/:匹配正则表达式regexp的行,例如sed -e /^$/d将删除所有空行
  8. "$":匹配最后一行,例如sed -e "$"d。可以混用行数和"$"

也可以混用正则表达式和行,不过意义不大,例如

  1. sed -e 10,/bb/d 删除第10行到包含bb的行,若在10行之后(不包括第10行)匹配不了bb,那么将连续匹配到最后一行。
  2. sed -e /aa/,/bb/d

函数

  1. d:删除行
  2. p:打印,常与-n配合使用。
  3. G: 匹配的行后面插入一空行
  4. {}: 命令组,例如sed 1,2{G\;G} 在第一二行后面插入两个空行
  5. !: 反转比匹配,例如sed -e "1,2 ! d" 只保留1,2,其他删除。
  6. c\text:使用text替换匹配的行
  7. a\text: 在匹配的行后面插入新行,内容为text
  8. i\text: 在匹配的行前面插入新行,内容为text
  9. s/regexp/replacement/:将regexp匹配的内容替换成replacement,s/regexp/replacement/2替换第二个匹配的s/regexp/replacement/g替换全部。replacement中可以使用"&"来表示regexp匹配的内容,例如"sed -e 's/ab/[&]/2'"将第二个匹配的"ab"替换成"[ab]"
  10. w: sed -e 's/w1/& w2/w w2file' file。w filename : 该参数会将替换过的内容写入到文件w2file并输出替换后的整个文件。注意w2file里写的只是替换
  11. h/H/g/G/x:处理pattern space和hold space,一般配合使用

其他

多个文件同时编辑

  1. sed -e 's/yellow/blue/g' white.dat red.dat black.dat

执行文件中的指令

  1. sed -f script_file
  2. sed -e 1,10d -f script_file

参考

  1. http://linux.die.net/man/1/sed
  2. http://www.sealinger.com/archives/297/
  3. http://blog.sina.com.cn/s/blog_6975e5a90100o1l5.html
  4. http://sed.sourceforge.net/sed1line_zh-CN.html