一般在实际使用编辑器的过程中 , 常需要执行替换文件中的字串、搬移、删除、与搜寻资料行等等动作。
当然 , 一般交谈式编辑器(如 vi、emacs)都能做得到上述功能 , 但文件一旦有大量上述编辑需求时 , 则用它们编辑十分没有效率。本章将用举例的方式说明如何用 sed 自动执行这些编辑功能。此外 , 在本章
例中 , 均以下述方式描述文件的需求 :
将文件中...资料 , 执行...(动作)
如此 , 目的是为了能将它们迅速的转成编辑指令。其中 , " ...资料" 部份 , 转成指令中的位址参数表示 ;
"执行...动作" 部份 , 则转成函数参数表示 。另外 , 当 "执行...动作" 要由数个函数参数表示时 , 则可利
用 "{ "与 " }" 集合这些函数参数(解[9]) , 其指令形式如下 :
位址参数{
函数参数1
函数参数2
函数参数3
.
:
}
上述指令表示 , 将对符合位址参数的资料 , 依次执行函数参数1、函数参数2、函数参数3 ... 表示的动作。
下面各节 , 分别举例说明 sed 替换资料、移动、删除资料、及搜寻资料的命令。
3.1 替换文件中的资料
3.2 搬动文件中的资料
3.3 删除文件中的资料
3.4 搜寻文件中的资料
3.1 替换文件中的资料
Sed 可替换文件中的字串、资料行、甚至资料区。其中 , 表示替换字串的指令中的函数参数为 s(参照[section4.1]);
表示替换资料行、或资料区的指令中的函数参数为 c(参照[section4.5])。上述情况以下面三个例子说明。上述情况
以下面三个例子说明。
例一. 将文件中含 "machine" 字串的资料行中的 "chi" 字串 , 替换成为 "beta" 字串。其命令列如下 :
sed -e '/machine/s/chi/beta/g' input.dat(以後文件档都以 input.dat 代表)
例二. 将文件中第 5 行资料 , 替换成句子 "Those who in quarrels interpose, must often wipe a bloody nose."。
其命令列如下
sed -e '5c\
Those must often wipe a bloody nose.
' input.dat
例三. 将文件中 1 至 100 行的资料区 , 替换成如下两行资料 :
How are you?
data be deleted!
则其命令列如下
sed -e '1,100c\
How are you?\
data be deleted!
' input.dat
3.2 搬动文件中的资料
使用者可用 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 。下面举三个例子说明。
例一. 将文件中的前 100 资料 , 搬到文件中第 300 後输出。其命令列如下 :
sed -f mov.scr 文件档
mov.scr 档的内容为
1,100{
H
d
}
300G
其中 ,
1,100{
H
d
}
它表示将文件中的前 100 资料 , 先储存(参照[section4.19])在 hold space 之後删除 ;指令 300G (参照[section4.22])
表示 , 将 hold space 内的资料 , 添加在文件中的第 300 资料後输出。
例二. 将文件中含 "phi" 字串的资料行 , 搬至 mach.inf 档中储存。其命令列如下 :
sed -e '/phi/w mach.inf' 文件档
例三. 将 mach.inf 档内容 , 搬至文件中含 "beta" 字串的资料行。其命令列如下 :
sed -e '/beta/r mach.inf' 文件档
另外 , 由於 sed 是一 stream(参照[section1.4])编辑器 , 故理论上输出後的文件资料不可能再搬回来编辑。
3.3 删除文件中的资料
因为 sed 是一行编辑器 , 所以 sed 很容易删除个别资料行或整个资料区。一般用函数参数 d(参照[section4.2])或
D(参照[section4.17]) 来表示。下面举两个例子说明。
将文件内所有空白行全部删除。其命令列为
sed -e '/^$/d' 文件档
regular expression(解[附录 A]) , ^$ 表示空白行。 其中 , ^ 限制其後字串必须在行首; $ 限制其前字串必须在行尾。
将文件内连续的空白行 , 删除它们成为一行。其命令列为
sed -e '/^$/{
N
/^$/D
}' 文件档
这个有问题,稍后再做说明