SED使用说明(摘)

用途:一般 sed 最常用在编辑那些需要不断重复某些编辑动作的档上

Sed工作流程:(自己总结)
while (fgets(buf, sizeof(buf), input.dat) != NULL)
    if (匹配地址) {
        strcpy(pattern_space, buf);
        edit_by_function(pattern_space);
        fputs(pattern_space, stdout);
    }

Sed命令格式:
Sed 命令列可分成编辑指令和操作文档部份
sed 的编辑指令均由位址(address)和函数(function)两部份组成,格式:
       [address1[,address2]]function[argument]

也能够写一个sed脚本,执行 sed –f script input.dat
或:sed -e '编辑指令1' -e '编辑指令2' ... input.dat

实际上 , 地址参数表示法只是将要编辑的数据行 , 用他们的行数或其中的字符串来代替表示他们
当数据行中有符合 regular expression 所表示的字符串时 , 则执行函数参数指示的编辑动作。另外 , 在 regular expression 前后必须加上 "/"。例如指令为 /t.*t/d , 表示删除任何含两 "t" 字母的数据行。其中 , "." 表示任意字符; "*" 表示其前字符可重复任意次 , 他们结合 ".*" 表示两 "t" 字母间的任意字符串。

默认sed 会 "自动的" 将数据由 pattern space 输送到标准输出檔,在命令列上的选项 -n 表示输出由编辑指令控制
eg.
    sed -e '1,3p' input.dat        //将输出选定行+任何文档行,也就是说选定行将打印2遍
    sed -n -e '1,3p' input.dat     //-n选项不打印任何文档行,因此只是显示我们选定的行
当 "执行...动作" 要由数个函数参数表示时 , 则可利用 "{ "和 " }" 集合这些函数参数

使用者可用 sed 中的 hold space 暂存编辑中的数据、用函数参数 w(参照[section4.9])将文档数据搬动到其他文档、或用函数参数 r(参照[section4.8])将其他文檔内容搬到本文档内。Hold space 是 sed 用来暂存 pattern space 内数据的缓存器 , 当 sed 执行函数参数 h、H(参照[section4.19])时 , 会将 pattern space 资料暂存到 hold space;当执行函数参数 x、g、G(参照[section4.22])时 , 会将暂存的资料取到 pattern space

^$ 表示空白行。 其中 , ^ 限制其后字符串必须在行首; $ 限制其前字符串必须在行尾。

函数参数 N(参照[section4.16])表示 , 将空白行的下一行资料添加至 pattern space 内

函数参数介绍:函数参数 s 表示替换(substitute)文档内字符串。其指令格式如下 :
[address1[ ,address2]] s/pattern/replacemen/[flag]

& : 代表其前 pattern 字符串

flag : 主要用他来控制一些替换情况 :
当 flag 为 g 时 , 代表替换任何符合(match)的字符串 。
当 flag 为十进制数 m 时 , 代表替换行内第 m 个符合的字符串。
当 flag 为 p 时 , 代表替换第一个符合 pattern 的字符串后 , 将数据输出标准输出文档。
当 flag 为 w wfile 时 , 代表替换第一个符合 pattern 的字符串后 , 输出到 wfile 檔内(假如 wfile 不存在 , 则会重新开启名为 wfile 的档案)。

当没有 flag 时 , 则将本行内第一个(可能一行内有多个匹配)符合 pattern 的字符串以 replacement 字符串来替换

函数参数 a 表示将资料添加到文档中。其指令格式如下:
      [address1] a
      使用者所输入的数据

其他类似的格式函数包括:
函数参数 i 表示将资料插入文档中

函数参数 c 表示改变文档中的数据。其格式如下:
     [address1[ ,address2]]c    
使用者所输入的数据行1
使用者所输入的数据行2

函数参数 r 表示读入他档案内容到檔中。其指令格式如下 :
       [address1] r 他檔名称
函数参数 w 表示将檔中的写到他檔内。其指令格式如下 :
     [address1[ ,address2]] w 他檔名称

4.10 y
函数参数 y 表示转换数据中的字符
Eg.说明: 利用函数参数 y 指示 sed 做字母大小的转换。
sed -e 'y/abcdefghijklmnopqrstuvwxyz/ABCDEFGHIJKLMNOPQRSTUVWXYZ' input.dat
== cat input.dat |tr "a-z" "A-Z"

函数参数 ! 表示不执行函数参数

函数参数 n 表示读入下一行资料
sed 执行读入下一行动作的情况如下 :
输出在 pattern space 的数据。 将下一笔资料读到 pattern space。
执行下一个编辑指令eg      sed -n -e 'n' -e 'p' infro.dat

函数参数 q 表示跳离 sed

注意,大写字母的函数名往往表示为“添加”
函数参数 N 表示添加下一笔资料在 pattern space 内
Eg 说明 : 先利用函数参数 N 将两行数据置于 pattern space 内 , 在利用函数参数 s/
/ / 将两行数据间的分隔号(回车)以空白替代 , 如此两行数据变成一行输出
sed -e 'N' -e 's/
/ /' input.dat           == sed 'N;s//n//' input.dat

函数参数 h 表示暂存 pattern space 的资料至 hold space。其指令格式如下:
     [address1 ,[address2]] h
sed 执行暂存动作时 , 会盖掉(overwrite) hold space 内原来的数据。
当 sed 全部执行结束时 , hold space 内数据会自动清除

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

函数参数 g 表示和函数参数 h 相反的动作 , 他表示将 hold space 内资料放回 pattern space 内。其指令格式如下 :
     [address1,address2]g
sed 执行放回动作时 , 数据盖掉(overwrite)(批注[13]) pattern space 内原来的数据

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

函数参数 x 表示交换 hold space 和 pattern space 内的数据。其指令格式如下 :
     [address1 ,[address2]] x

常用的 regular expression
普通字符 由普通字符所组成的 regular expression 其意义和原字符串字面意义相同。  
^字符串 限制字符串必须出现于行首 。
$字符串 限制字符串必须出现行尾。  
. 表示任意一字符。
[...] 字符集合, 用以表示两中括号间任何字符当中的任一个 ,如 [^...]表示两中括号间任何字符以外的字符。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值