Chinaunix首页 | 论坛 | 博客
  • 博客访问: 210268
  • 博文数量: 145
  • 博客积分: 3000
  • 博客等级: 中校
  • 技术积分: 1720
  • 用 户 组: 普通用户
  • 注册时间: 2009-07-14 18:42
文章分类

全部博文(145)

文章存档

2011年(1)

2009年(144)

我的朋友

分类: LINUX

2009-10-18 09:13:23

by tangke 2009-10-18
 
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 字串来替换 。
分隔符: 在 "/pattern/replace/[flag] " 中 "/" 被当成一 delimiter。除了空白(blank)、换行(newline) 之外 , 使用者可用任何字元作为 分隔符。例如下述编辑指令
        s#/usr#/usr1#g

上述命令中 \verb|#| 为 分隔符。如果用 "/" 做 分隔符 , 则 sed 会将 pattern 与 replacement 中的 "/" 当成 分隔符 而发生错误。
例:
题目 : 替换 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。
例:

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 改变它成为使用者所输入的资料。
例 :

 
4.9 w

函数参数 w 表示将文件中的写到它档内。其指令格式如下 :

     [address1[ ,address2]] w 它档名称

对於上述格式有下面几点说明 :

函数参数 w 最多与两个位址参数配合。
在指令中 , 函数参数 w 与它档名称间 , 只能有一空格。
sed 执行写出动作的情况如 : 将 pattern space 内资料写到它档内。资料写入时 , 会取代(overwrite)原来档案内的资料。另外 , 当它档不存在时 , sed 会重新产生(creat)它。
例:
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 执行n的含义为读入下一行资料,并且填充到pattern space,再执行下一个编辑指令。

4.16 N

函数参数 N 表示添加下一笔资料在 pattern space 内。其指令格式如下:

     [address1 ,[address2]] N

对上述格式有下面几点说明 :

函数参数 N 最多配合两个位址参数。
sed 执行时 , 将下一行资料读入并添加在 pattern space 内 , 资料行间以换行字元分隔。此外 , 在替换时 , 换行字元可用 \n 来 match。
题目 : 输出 input.dat 档内偶数行资料。假设 input.dat 档内容如下:
1
2
3
4
5
6
7
8
9

说明: 在命令列上以选项 -n , 将资料输出的控制权转给指令。
利用函数参数 n 将下一行资料(偶数行)取代 pattern space 内的资料行(奇数行)。
利用函数参数 p 将 pattern space 内的资料(偶数行)输出。
最後 , 整个输出只有原先档内的偶数行资料。
sed -n -e 'n' -e 'p' input.dat
2
4
6
8
利用函数参数N将下一行资料(偶数行)添加到pattern space资料,并且通过p一起打印出来.
sed -n -e 'N' -e 'p' input.dat
1
2
3
4
5
6
7
8
9

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。 
例子:
4.19 h

函数参数 h 表示暂存 pattern space 的资料至 hold space。其指令格式如下:

     [address1 ,[address2]] h

对上述格式有下面几点说明 :

函数参数 h 最多配合两个位址参数。
sed 执行暂存动作时 , 会盖掉(overwrite) hold space 内原来的资料。
当 sed 全部执行结束时 , hold space 内资料会自动清除。 

4.20 H

函数参数 H 与 h 唯一差别是 , sed 执行 h 时 , 资料盖掉(overwrite) hold space 内原来的资料 , 而 H , 资料则是 "添加(append)" 在 hold space 原来资料後。

例子:
4.21 g

   函数参数 g 表示与函数参数 h 相反的动作 , 它表示将 hold space 内资料放回 pattern space 内。其指令格式如下 :

     [address1,address2]g

函数参数 g 最多配合两个位址参数。
sed 执行放回动作时 , 资料盖掉(overwrite)(解[13]) pattern space 内原来的资料。

4.22 G

函数参数 G 与 g 唯一差别是 , sed 执行 g 时 , 资料盖掉(overwrite) pattern space 内原来的资料 , 而 G , 资料则是 "添加(append)" 在 pattern space 原来资料後。

例子:
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.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

阅读(337) | 评论(0) | 转发(0) |
0

上一篇:commands: autojump

下一篇:shell: 字符串处理

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