Chinaunix首页 | 论坛 | 博客
  • 博客访问: 92291482
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类:

2008-04-18 23:23:39

4.22 G

      

函数参数 G 与 g 唯一差别是 , sed 执行 g 时 , 数据盖掉(overwrite) pattern space 内原来的数据 , 而 G , 数据则是 "添加(append)" 在 pattern space 原来数据后。例子请参考 section 3.2 例一。 

4.23 x

      

   函数参数 x 表示交换 hold space 与 pattern space 内的数据。其指令格式如下 : 

     [address1 ,[address2]] x 


函数参数 x 大部份与其它处理 hold space 的函数参数一起配合。例如 , 将 input.dat 文件内第 1 行资料取代第 3 行资料。此时 , 用函数参数 h 与 x 来配合。其中 , 以函数参数 h 将第 1 资料存入 hold space  当第 3 行数据出现在 pattern space , 以函数参数 x 交换 hold space 与 pattern space 的内容。如此 , 第 3 行资料就被第 1 资料替代。其命令列如下: 

sed -e '1h' -e '3x' input.dat

4.24 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

说明: 用指令 b p1 与 :p1 构成执行增加字母的循环(loop) , 同时在字母出现 40 个时 , 也用指令 b 来跳出循环。下面就以文件内第一行数据 "A" 为例 , 描述它如何连续多添加 39 个 "A" 在同一行: 
用指令 s/A/AA/(参照 section4.1)将 "A" 替换成 "AA"。 
用指令 b p1 与 :p1 构成循环(loop) , 它目的使上述动作被反复的执行。每执行一次循环 , 则数据行上的 "A" 就多出一个。例如 , 第一次循环数据行变成 "AA" , 第二次循环资料行变成 "AAA" ...。 
用指令 [ABC]\{40\}/b(批注[15]) 来作为停止循环的条件。当数据行有连续 40 个 A 出现时 , 函数参数 b 将执行的指令跳到最后 , 停止对此行的编辑。 
同样 , 对其它数据行也如同上述的方式执行。 
sed 命令列如下 : 
sed -e '{
:p1
/A/s/A/AA/
/B/s/B/BB/
/C/s/C/CC/
/[ABC]\{40\}/b
b p1
}' input.dat

4.25 t

      

基本上 , 函数参数 t 与 函数参数 b 的功能类似 , 除了在执行 t 的 branch 前 , 会先去测试其前的替换指令有没有执行替换成功外。在 script file 内的情况如下: 
                   .
                   .
                   .
              编辑指令m1
              :记号
              编辑指令m2
                   .
                   .
                   .
              s/.../.../
              [address1,[address2]]t [记号]
              编辑指令m3

其中 , 与函数参数 b 不同处在于 , 执行函数参数 t branch 时 , 会先检查其前一个替换指令成功与否。如成功 , 则执行 branch  不成功 , 则不 branch , 而继续执行下一个编辑指令 , 例如上面的编辑指令m3。 
范例: 
题目 : 将 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 
普通字符  由普通字符所组成的 regular expression 其意义与原字符串字面意义相同。  
^字符串  限制字符串必须出现于行首 。 
$字符串  限制字符串必须出现行尾。  
.  表示任意一字符。 
[...]  字符集合, 用以表示两中括号间所有字符当中的任一个 ,如 [^...]表示两中括号间所有字符以外的字符。 
-&  字符集合中可用"&"指定字符的范围。  
*  用以形容其前的字符(或字符集合)可重复任意多次 。 
\n  表示嵌入新行字符(imbedded new line character)。  
\(...\)  于 regular expression 中使用"\(" "\)"来括住一部份的 regular expression  其后可用"\1"来表示第一个被"\(" "\)"括住的部份。若 regular expression 中使用数次的"\(" "\)"来括住不同的部份 , 则依次使用"\1","\2","\3",...(最多可到"\9")。
阅读(330) | 评论(0) | 转发(0) |
0

上一篇:sed函数参数大全(3)

下一篇:TCSH入门教程

给主人留下些什么吧!~~