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")。
| | |