sed 命令详解

介绍函数参数

 

介绍函数参数

   本章将以一节一个函数参数的方式 ,介绍所有 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 /003 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.../(xyzabc 代表某些字符) 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 替换成 C1C1 替换成 B1B1 替换成 A1input.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

 

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值