免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1079 | 回复: 0
打印 上一主题 下一主题

sed学习笔记 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-09-11 22:17 |只看该作者 |倒序浏览
++sed 编辑指令的格式如下 :  [address1[,address2]]function[argument]
  #address1/2可为行数或regular expression, 函数参数 function[argument] 为 
sed
 的内定函数
  #/apple/,/orange/d 表示删除含有 "apple" 至 "orange" 字符串的
数据

  ++函数参数 
功能
列表: label 建立 script. file 内指令互相参考的位置。
  # 建立批注
  { } 集合有相同位址参数的指令。
  ! 不执行函数参数。
  = 印出资料行数( line number )。
  a\ 添加使用者输入的数据。
  b label 将执行的指令跳至由 : 建立的参考位置。
  c\ 以使用者输入的数据取代数据。
  d 删除数据。
  D 删除 pattern space 内第一个 newline 字母 \ 前的数据。
  g 拷贝数据从 hold space。
  G 添加资料从 hold space 至 pattern space 。
  h 拷贝数据从 pattern space 至 hold space 。
  H 添加资料从 pattern space 至 hold space 。
  l 印出 l 资料中的 nonprinting character 用 ASCII 码。
  i\ 插入添加使用者输入的数据行。
  n 读入下一笔资料。
  N 添加下一笔资料到 pattern space。
  p 印出资料。
  P 印出 pattern space 内第一个 newline 字母 \ 前的数据。
  q 跳出 sed 编辑。
  r 读入它檔内容。
  s 替换字符串。
  t label 先执行一替换的编辑指令 , 如果替换成牛p>则将编辑指令跳至 : label 处执行。
  w 写资料到它
文件
内。
  x 交换 hold space 与 pattern space 内容。
  y 转换(transform)字符。
  ++ 函数参数 s 表示替换(substitute)文件内字符串。其指令格式如下 :
  [address1[ ,address2]] s/pattern/replacemen/[flag]
  #flag : 主要用它来控制一些替换情况 :
  当 flag 为 g 时 , 代表替换所有符合(match)的字符串 。
  当 flag 为十进制数 m 时 , 代表替换行内第 m 个符合的字符串。
  当 flag 为 p 时 , 代表替换第一个符合 pattern 的字符串后 , 将数据输出标准输出文件。
  当 flag 为 w wfile 时 , 代表替换第一个符合 pattern 的字符串后 , 输出到 wfile 檔内(如果 wfile 不存在 , 则会重新开启名为 wfile 的档案)。
  #数据文件的 "test" 被替换成 "test my car"
  sed -e 's/test/& my car/' filename ## &:代表其前 pattern 字符串
  #数据文件的 "test my car" 被替换成 "[my car test]"
  sed -e 's/\(test\) \(my\) \(car\)/[\2 \3 \1]/' filename #\n代表pattern中被第 n 个 \(XX\)所括起来的字符串
  ++函数参数 d 表示删除数据行 , 其指令格式如下:
  [address1[ ,address2]] d
  ++函数参数 a 表示将资料添加到文件中。其指令格式如下:
  [address1] a\ 使用者所输入的数据
  sed -e '/美国人/a\中国人' filename #添加 "中国人" 在含 "美国人" 字符串的数据行后
  #如果需要插入多行,可以加\n
  ++函数参数 i 表示将资料插入文件中。其指令格式如下:
  [address1] i\ 使用者所输入的数据
  ++函数参数 r 表示读入它档案内容到檔中。其指令格式如下 :
  [address1] r 它檔名称
  ++函数参数 w 表示将檔中的写到它檔内。其指令格式如下 :
  [address1[ ,address2]] w 它檔名称
  ++函数参数 y 表示转换数据中的字符。其指令格式如下 :
  [address1[ ,address2]]y /xyz…/abc…/
  #其中 abc… 与 xyz… 的字符个数必须相同,a字符转换成x字符、b转成y、c转成z…
  sed -e 'y/abcdefghijklmnopqrstuvwxyz/ABCDEFGHIJKLMNOPQRSTUVWXYZ/' input.dat #字母大小的转换。
  ++函数参数 ! 表示不执行函数参数。当有如下指令时 ,
  [address1[ , address2]] ! 函数参数
  sed -e '/1996/!d' input.dat #删除 除了含 "1996" 字符串外的所有行
  ++参数n表示读入下一行资料。其指令格式如下:
  [address1[ ,address2]] n
  sed -n -e 'n' -e 'p' infro.dat #输出 input.dat 文件内偶数行资料
  ++函数参数 q 表示跳离 sed 。其指令格式如下:
  [address1] q
  ++函数参数 = 表示印出资料的行数。其指令格式如下:
  [address1 ,[address2]] =
  sed -e '=' input.dat #印出资料的行数
  ++ 函数参数#后的文字为注解,当注解超过多行时,其行间须以"\"换行字符相隔
  ++函数参数 N 表示添加下一笔资料在 pattern space 内。其指令格式如下:
  [address1 ,[address2]] N
  #将下述两行数据合并。假设 input.dat 的内容如下 :
  #The UNIX
  #Operating System
  sed -e 'N' -e 's/\n/ /' input.dat
  ++函数参数 D 表示删除 pattern space 内的第一行资料。其指令格式如下:
  [address1,address2]D
  #函数参数 D 与 d 的比较如下 :
  当 pattern space 内只有一数据行时 , D 与 d 作用相同。
  当 pattern space 内有多行资料行时
  D 表示只删除 pattern space 内第一行资料 ; d 则全删除。
  D 表示执行删除后 , pattern space 内不添加下一笔数据 , 而将剩下的数据重新执行 sed script. ; d 则读入下一行后执行 sed script。
  ++函数参数 P 表示印出 pattern space 内的第一行资料。其指令格式如下:
  [address1,address2] P
  ++输出 input.dat 文件内奇数行资料。假设 input.dat 檔内容如下:
  #The
  #UNIX
  #System
  sed -n -e 'N' -e 'P' infro.dat
  #说明: 在
命令
列上
  #以选项 -n , 将数据输出的控制权(参照[section2.5])转给指令。
  #利用函数参数 N 将偶数行添加至 pattern space 内奇数行后。
  #利用函数参数 P 将 pattern space 内的第一行(奇数行)输出。
  #在奇数行输出后 , pattern space 内剩下的数据行(偶数行)则被放弃输出。最后 , 整个输出只有原先的奇数行数据。
  ++函数参数 h 表示暂存 pattern space 的资料至 hold space。其指令格式如下:
  [address1 ,[address2]] h
  #函数参数H与h唯一差别是,sed执行h时,数据盖掉(overwrite) hold space内原来的数据,而H,数据则是"添加(append)"在 hold space 原来数据后.
  ++函数参数 g 表示与函数参数 h 相反的动作 , 它表示将 hold space 内资料放回 pattern space 内。其指令格式如下 :
  [address1,address2]g
  #函数参数G与g唯一差别是,sed 执行g时,数据盖掉(overwrite) pattern space内原来的数据,而G,数据则是"添加(append)"在 pattern space原来数据后.
  ++函数参数 x 表示交换 hold space 与 pattern space 内的数据。其指令格式如下 :
  [address1 ,[address2]] x
  sed -e '1h' -e '3x' input.dat #将 input.dat 文件内第 1 行资料取代第 3 行资料
  #以函数参数 h 将第 1 资料存入 hold space ; 当第 3 行数据出现在 pattern space , 以函数参数 x 交换 hold space 与 pattern space 的内容。如此 , 第 3 行资料就被第 1 资料替代。
  ++ b、:label
  函数参数 : 与函数参数 b 可在 sed script. 内建立类似 BASIC 语言中 GOTO 指令的功能。其中 , 函数参数 : 建立标记;函数参数 b 将下一个执行的指令 branch 到标记处执行。函数参数 : 与 b , 在 script. file 内配合的情况如下
  编辑指令m1
  :记号
  编辑指令m2
  [address1,[address2]]b [记号]
  其中 , 当 sed 执行至指令 [address1,[address2]]b [记号] 时 , 如 pattern space 内的数据符合
地址
参数 , 则 sed 将下一个执行的位置 branch 至由 :记号(批注[14])设定的标记处 , 也就是再由 "编辑指令m2" … 执行。另外 , 如果指令中函数参数 b 后没有记号 , 则 sed 将下一个执行的指令 branch 到 script. file 的最后 , 利用此可使 sed script. 内有类似 C 语言中的 case statement 结构。
  #将 input.dat 文件内数据行的开头字母重复印 40 次。假设 input.dat 檔的内容如下 :
  A
  B
  C
  #sed 命令列如下 :
  sed -e '{
  :p1
  /A/s/A/AA/
  /B/s/B/BB/
  /C/s/C/CC/
  /[ABC]\{40\}/b
  b p1
  }' input.dat
  ++基本上 , 函数参数 t 与 函数参数 b 的功能类似 , 除了在执行 t 的 branch 前 , 会先去测试其前的替换指令有没有执行替换成功外。在 script. file 内的情况如下:
  编辑指令m1
  :记号
  编辑指令m2
  s/…/…/
  [address1,[address2]]t [记号]
  编辑指令m3
  其中 , 与函数参数 b 不同处在于 , 执行函数参数 t branch 时 , 会先检查其前一个替换指令成功与否。如成功 , 则执行 branch ; 不成功 , 则不 branch , 而继续执行下一个编辑指令
  ##将 input.dat 文件中资料 A1 替换成 C1、C1 替换成 B1、B1 替换成 A1。input.dat 檔的内容如下:
  代号
  B1
  A1
  B1
  C1
  A1
  C1
  说明 : input.dat 文件中全部数据行只需要执行一次替换动作 , 但为避免数据被替换多次 , 所以利用函数参数 t 在 sed script. 内形成一类似 C 语言中 case statement 结构 , 使每行数据替换一次后能立即用函数参数 t 跳离替换编辑。
  sed 命令列 :
  sed -e '{
  s/A1/C1/
  t
  s/C1/B1/
  t
  s/B1/A1/
  t
  }' input.dat
  ++常用的 regular expression
  普通字符 由普通字符所组成的 regular expression 其意义与原字符串字面意义相同。
  ^字符串 限制字符串必须出现于行首 。
  $字符串 限制字符串必须出现行尾。
  . 表示任意一字符。
  […] 字符集合, 用以表示两中括号间所有字符当中的任一个 ,如 [^…]表示两中括号间所有字符以外的字符。
  -& 字符集合中可用"&"指定字符的范围。
  * 用以形容其前的字符(或字符集合)可重复任意多次 。
  \n 表示嵌入新行字符(imbedded new line character)。
  \(…\) 于 regular expression 中使用"\(" "\)"来括住一部份的 regular expression ; 其后可用"\1"来表示第一个被"\(" "\)"括住的部份。若 regular expression 中使用数次的"\(" "\)"来括住不同的部份 , 则依次使用"\1","\2","\3",…(最多可到"\9")。
               
               
               
               

本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u2/79060/showart_1186521.html
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP