| 您的位置:首页 > 文档 > Shell > |
文章分类热门文章 |
SED 手册 - 4.介绍函数参数创建:2005-10-26 00:49:44 作者:Unlinux 来自: http://www.Unlinux.com 本章将以一节一个函数参数的方式 ,介绍所有 sed 提供的函数参数 , 其中有 | s | d | a | i | c | p | l | r | w | y | ! | n | q | = | # | N | D | P | h | H | g | G | x | b | t | 另外 , 在各节中 , 首先简单介绍函数参数功能 , 接着说明函数参数与位址参数配合的格式 , 而其中也一描述 sed 执行此函数参数的工作情形。 4.1 s 函数参数 s 表示替换(substitute)文件内字串。其指令格式如下 : [address1[ ,address2]] s/pattern/replacemen/[flag] 对上述格式有下面几点说明 : 函数参数 s 最多与两个位址参数配合。 关於 "s/pattern/replacement/[flag]"(解[12]) 有下面几点说明: pattern : 它为 reguler expression 字串。它表示文件中要被替换的字串。 replacement : 它为一般字串。但其内出现下列字元有特别意义 : & : 代表其前 pattern 字串。例如 sed -e 's/test/& my car/' 资料档名 指令中 , & 代表 pattern 字串 "test"。故执行後 , 资料档的 "test" 被替换成 "test my car"。 n : 代表 pattern 中被第 n 个 ( 、)(参照[附录 A]) 所括起来的字串。例如 sed -e 's/(test) (my) (car)/[2 3 1]/' 资料档名 指令中 , 1 表示 "test"、2 表示 "my"、1 表示 "car" 字串。故执行後 , 资料档的 "test my car" 被替换 成 "[my car test]"。 : 可用它来还原一些特殊符号(如上述的 & 与 )本身字面上的意义 , 或用它来代表换行。 flag : 主要用它来控制一些替换情况 : 当 flag 为 g 时 , 代表替换所有符合(match)的字串 。 当 flag 为十进位数字 m 时 , 代表替换行内第 m 个符合的字串。 当 flag 为 p 时 , 代表替换第一个符合 pattern 的字串後 , 将资料输出标准输出档。 当 flag 为 w wfile 时 , 代表替换第一个符合 pattern 的字串後 , 输出到 wfile 档内(如果 wfile 不存在 , 则会 重新开启名为 wfile 的档案)。 当没有 flag 时 , 则将资料行内第一个符合 pattern 的字串以 replacement 字串来替换 。 delimiter : 在 "/pattern/replace/[flag] " 中 "/" 被当成一 delimiter。除了空白(blank)、换行(newline) 之外 , 使用者可用任何字元作为 delimiter。例如下述编辑指令 s#/usr#/usr1#g 上述命令中 verb|#| 为 delimiter。如果用 "/" 做 delimiter , 则 sed 会将 pattern 与 replacement 中的 "/" 当成 delimiter 而发生错误。 例: 题目 : 替换 input.dat 档(後面如果没有特别指定 , 均假设文件档名为 input.dat)内 "1996" 字串成 "1997" , 同时 将这些资料行存入 year97.dat 档内。 说明 : 用函数参数 s 指示 sed 将 "1996" 字串替换成 "1997" , 另外用 s argument 中的 flag w 指示 sed 将替换 过的资料行存入 year97.dat 档内。 sed 命令列: sed -e 's/1996/1997/w year97.dat' input.dat 4.2 d 函数参数 d 表示删除资料行 , 其指令格式如下: [address1[ ,address2]] d 对上述格式有下面几点说明: 函数参数 d 最多与两个位址参数配合。 sed 执行删除动作情况如下 : 将 pattern space 内符合位址参数的资料删除。 将下一笔资料读进 pattern space 。 重新执行 sed script。 例 : 可参考 section 3.3。 4.3 a 函数参数 a 表示将资料添加到文件中。其指令格式如下: [address1] a 使用者所输入的资料 对上述格式有下面几点说明: 函数参数 a 最多与一个位址参数配合。 函数参数 a 紧接着 "" 字元用来表示此行结束 , 使用者所输入的资料必须从下一行输入。如果资料超过一行 , 则须在 每行的结尾加入""。 sed 执行添加动作情况如下 : 当 pattern space 内资料输出後 , sed 跟着输出使用者所输入的资料。 例 : 题目: 添加 "多工作业系统" 在含 "UNIX" 字串的资料行後。假设 input.dat 档的内容如下 : UNIX 说明: 用函数参数 a 将所输入的资料添加在含 "UNIX" 字串的资料行後。 sed 命令列如下 : sed -e '/UNIX/a 多工作业系统 ' input.dat 执行上述命令後 , 其输出结果如下 : UNIX 多工作业系统 4.4 i 函数参数 i 表示将资料插入文件中。其指令格式如下: [address1] i 使用者所输入的资料 对上述格式有下面几点说明: 函数参数 i 最多与一个位址参数配合。 函数参数 i 紧接着 "" 字元用来表示此行结束 , 使用者所输入的资料必须从下一行输入。如果资料超过一行 , 则须在 每行的结尾加入""。 sed 执行插入动作的情况如下 : 在 pattern space 内资料输出前 , sed 先输出使用者所输入的资料。 例 : 题目: 将 "文章版权属於中央研究院" 插在 input.dat 档中含 "院长 : 李远哲" 的资料行之前。假设 input.dat 档内 容如下 : 院长 : 李远哲 说明: 用函数参数 i 将资料行 "文章版权属於中央研究院" 插在含 "院长 : 李远哲" 的资料行之前。 sed 命令列如下: sed -e '/院长 : 李远哲/i 文章版权属於中央研究院 ' input.dat 执行上述命令後的输出如下 : 文章版权属於中央研究院 院长 : 李远哲 4.5 c 函数参数 c 表示改变文件中的资料。其格式如下: [address1[ ,address2]]c 使用者所输入的资料 对上述格式有下面几点说明: 函数参数 c 最多与两个位址参数配合。 函数参数 c 紧接着 "" 字元用来表示此行结束 , 使用者所输入的资料必须从下一行输入。如果资料超过一行 , 则须在 每行的结尾加入""。 sed 执行改变动作的情况 : 在 pattern space 内资料输出时 , sed 改变它成为使用者所输入的资料。 例 : 参考 section 3.1 之例二、三。 4.6 p 函数参数 p 表示印出资料。其指令格式如下 : [address1[ , address2]] p 对於上述格式有下面几点说明 : 函数参数 p 最多与两个位址参数配合。 sed 执行印出动作的情况如下 : sed 拷备一份 pattern space 内容至标准输出档。 例 : 参考 section 3.4 开头的内容。 4.7 l 函数参数 l , 除可将资料中的 nonprinting character 以 ASCII码列出外 , 其於均与函数参数 p 相同。例如 , 将下 面 input.dat 档中的 ^[ 以 ASCII 码印出 The Great ^[ is a movie starring Steve McQueen. 执行命令 sed -e 'l' input.dat 後 , 则输出结果如下 : The Great 03 is a movie starring Steve McQueen. The Great is a movie starring Steve McQueen. 上述第二行资料为 sed 的自动输出(请参照解[]。 4.8 r 函数参数 r 表示读入它档案内容到文件中。其指令格式如下 : [address1] r 它档名称 对於上述格式有下面几点说明 : 函数参数 r 最多与一个位址参数配合。 在指令中 , 函数参数 r 与它档名称间 , 只能有一空格。 sed 执行读入动作的情况如下 : 在 pattern space 内资料输出後 , sed 读出它档的内容跟着输出。当它档不存在时 , sed 照样执行其它指令而不会有任何错误讯息产生。 例 : 参考 section 3.1 之例三。 4.9 w 函数参数 w 表示将文件中的写到它档内。其指令格式如下 : [address1[ ,address2]] w 它档名称 对於上述格式有下面几点说明 : 函数参数 w 最多与两个位址参数配合。 在指令中 , 函数参数 w 与它档名称间 , 只能有一空格。 sed 执行写出动作的情况如 : 将 pattern space 内资料写到它档内。资料写入时 , 会取代(overwrite)原来档案内的资 料。另外 , 当它档不存在时 , sed 会重新产生(creat)它。 例:参考 section 3.1 之例二。 4.10 y 函数参数 y 表示转换资料中的字元。其指令格式如下 : [address1[ ,address2]]y /xyz.../abc.../ 对於上述格式有下面几点说明 : 函数参数最多配合两个位址参数。 指令中 , /abc.../xyz.../(x、y、z、a、b、c 代表某些字元) 为 y 的 argument 。其中 abc... 与 xyz... 的字元个数 必须相同。 sed 执行转换时 , 将 pattern space 内资料内的 a 字元转换成 x 字元 、b 字元转换成 y 字元 、c 字元转换成 z 字 元 ...。 例: 题目: 将 input.dat 档中的小写字母改成大写。假设 input.dat 档的内容如下 : Sodd's Second Law: Sooner or later, the worst possible set of circumstances is bound to occur. 说明:利用函数参数 y 指示 sed 做字母大小的转换。 sed 命令列如下 : sed -e ' y/abcdefghijklmnopqrstuvwxyz/ABCDEFGHIJKLMNOPQRSTUVWXYZ/ ' input.dat 执行上述命令输出结果如下 : SODD'S SECOND LAW: SOONER OR LATER, THE WORST POSSIBLE SET OF CIRCUMSTANCES IS BOUND TO OCCUR. 4.11 ! 函数参数 ! 表示不执行函数参数。当有如下指令时 , [address1[ , address2]] ! 函数参数 表示 , 对符合位址参数之资料不执行函数参数。例如删除 , 除了含 "1996" 字串 , 所有资料行 , 则执行如下命令 sed -e '/1996/!d' input.dat 4.12 n 函数参数 n 表示读入下一行资料。其指令格式如下: [address1[ ,address2]] n 对上述格式有下面几点说明 : 函数参数 n 最多配合两个位址参数。 sed 执行读入下一行动作的情况如下 : 输出在 pattern space 的资料。 将下一笔资料读到 pattern space。 执行下一个编辑指令。 例(可与[section4.18]中的例比较): 题目 : 输出 input.dat 档内偶数行资料。假设 input.dat 档内容如下: The UNIX Operation System 说明: 在命令列上 以选项 -n , 将资料输出的控制权(参照[section2.5])转给指令。 利用函数参数 n 将下一行资料(偶数行)取代 pattern space 内的资料行(奇数行)。 利用函数参数 p 将 pattern space 内的资料(偶数行)输出。 最後 , 整个输出只有原先档内的偶数行资料。 sed 命令列如下 : sed -n -e 'n' -e 'p' infro.dat 执行上述命令後 , 输出的结果如下 : UNIX System 4.13 q 函数参数 q 表示跳离 sed 。其指令格式如下: [address1] q 对上述格式有下面几点说明 : 函数参数 q 最多配合一个位址参数。 sed 执行跳离动作时 , 它停止输入 pattern space 资料 , 同时停止资料送到标准输出档。 例 : 题目: 对文件档执行 script_file 内的编辑指令 , 除非遇到 "Linux" 字串。 说明: 无论 script_file 内是何种指令 , 使用者只要在命令列上用指令/Linux/q , 函数参数 q 会强迫 sed 遇 到 "Linux" 时做跳离动作。 sed 命令列如下 : sed -e '/Linux/q' -f script_file input.dat 4.14 = 函数参数 = 表示印出资料的行数。其指令格式如下: [address1 ,[address2]] = 对上述格式有下面几点说明 : 函数参数 = 最多配合两个位址参数。 执行时 , 行数将在资料输出前先输出。 例 : 题目: 印出 input.dat 档内资料行数。假设 input.dat 的内容如下 : The UNIX Operating System 说明 : 用函数参数 = 来印出资料的行数。 sed 命令列如下 : sed -e '=' input.dat 执行上述命令後 , 输出的结果如下 : 1 The UNIX 2 Operating System 4.15 # 在 script file 内 , 函数参数 # 後的文字为注解。当注解文字超过多行时 , 其行间须以 "" 换行字元相隔。 4.16 N 函数参数 N 表示添加下一笔资料在 pattern space 内。其指令格式如下: [address1 ,[address2]] N 对上述格式有下面几点说明 : 函数参数 N 最多配合两个位址参数。 sed 执行时 , 将下一行资料读入并添加在 pattern space 内 , 资料行间以换行字元(embedded newline character) 分隔。此外 , 在替换时 , 换行字元可用 n 来 match。 例 : 题目: 将下述两行资料合。假设 input.dat 的内容如下 : The UNIX Operating System 说明 : 先利用函数参数 N 将两行资料置於 pattern space 内 , 在利用函数参数 s/n/ / 将两行资料间的分隔号 n 以空白替代 , 如此两行资料变成一行输出。 sed 命令列如下 : sed -e 'N' -e 's/n/ /' input.dat 执行上述命令後 , 其输出的结果如下: The UNIX Operating System 4.17 D 函数参数 D 表示删除 pattern space 内的第一行资料。其指令格式如下: [address1,address2]D 对上述格式有下面几点说明 : 函数参数 D 最多配合两个位址参数。 函数参数 D 与 d 的比较如下 : 当 pattern space 内只有一资料行时 , D 与 d 作用相同。 当 pattern space 内有多行资料行时 D 表示只删除 pattern space 内第一行资料 ; d 则全删除。 D 表示执行删除後 , pattern space 内不添加下一笔资料 , 而将剩下的资料重新执行 sed script ; d 则读入下一行後 执行 sed script。 例 : 参考 section 3.3 的第二个例子。 4.18 P 函数参数 P 表示印出 pattern space 内的第一行资料。其指令格式如下: [address1,address2] P 对上述格式有下面几点说明 : 函数参数 P 最多配合两个位址参数。 P 与 p , 除了面对的 pattern space 内的资料行数不同外 , 其它均相同。 例(可与[section4.12]中的例): 题目 : 输出 input.dat 档内奇数行资料。假设 input.dat 档内容如下: The UNIX System 说明: 在命令列上 以选项 -n , 将资料输出的控制权(参照[section2.5])转给指令。 利用函数参数 N 将偶数行添加至 pattern space 内奇数行後。 利用函数参数 P 将 pattern space 内的第一行(奇数行)输出。 在奇数行输出後 , pattern space 内剩下的资料行(偶数行)则被放弃输出。最後 , 整个输出只有原先的奇数行资料。 sed 命令列 : sed -n -e 'N' -e 'P' infro.dat 执行上述命令後 , 输出的结果如下 : The System 4.19 h 函数参数 h 表示暂存 pattern space 的资料至 hold space。其指令格式如下: [address1 ,[address2]] h 对上述格式有下面几点说明 : 函数参数 h 最多配合两个位址参数。 sed 执行暂存动作时 , 会盖掉(overwrite) hold space 内原来的资料。 当 sed 全部执行结束时 , hold space 内资料会自动清除。 例 :参考 section 3.4 的例子。 4.20 H 函数参数 H 与 h 唯一差别是 , sed 执行 h 时 , 资料盖掉(overwrite) hold space 内原来的资料 , 而 H , 资料则 是 "添加(append)" 在 hold space 原来资料後。例题请参考 section 3.2 之例一。 4.21 g 函数参数 g 表示与函数参数 h 相反的动作 , 它表示将 hold space 内资料放回 pattern space 内。其指令格式如下 : [address1,address2]g 函数参数 g 最多配合两个位址参数。 sed 执行放回动作时 , 资料盖掉(overwrite)(解[13]) pattern space 内原来的资料。 例题 :参考 section 3.4 的例子。 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 转载自:http://www.unlinux.com/doc/shell/20051026/184.html 【评论】 【加入收藏夹】 【大 中 小】 【打印】 【关闭】 ※ 相关链接
|