第二章 流编辑器sed 一. 什么是流编辑器? 流编辑器是一种流水线型的、非交互式 的文本编辑器。 它使用户可以在命令行上(而不是编辑器中)对文件进行无破坏 性编辑。
屏幕编辑器与流编辑器的区别 vi sed 1.用户操作方式 2.文本处理模式 3.编辑命令地点 4.编辑空间 5.对原文本影响 6.批量发出命令 7.基本编辑单位 8.主要应用场合 9.可编文件大小 交互式 全局并行(可逆行) 编辑器中 临时文件(文件缓存) 破坏性的 不能 字符 人工编辑 较小 非交互式 逐行串行(不可逆行) 命令行上 模式空间(行缓存) 非破坏性的 可以 行 程序自动编辑 较大
二. sed 命令基本格式 sed ‘command’ file sed -n ‘command’ file sed -e ‘command1’ –e ‘command2’ file sed -f cmd_file file 任选项说明: command: 行编命令 -n: 只显示与模式匹配的行(缺省都显示) -e: 在命令行上进行多次编辑 -f: 编辑命令放在随后的命令表文件中
注意: sed命令的结果是送到标准输出上,即 荧光屏上,如果要将结果保存在文件中, 应该使用重定向功能! 例如: sed ‘s/student/teacher/g’ oldfile > newfile 如果要把结果保留在原文件中,该如何办?
三. 行编辑命令的基本格式 [行定位符][编辑命令元字符] 例如: sed ‘1,9d’ abc sed -n ‘196p’ abc /正则表达式/[编辑命令元字符] 例如: sed -n ‘/student/p’ filename sed ‘/xyz/d’ filename 3. [定位符][元字符]/正则表达式/[元字符] 例如: sed –n ‘3,8s/east/west/’ filename sed –n ‘1,$s/computer/network/g’ filename
四. 出错信息和退出状态 操作系统命令出错: sed -r ‘s/this/that/’ myfile 显示: sed: ERROR: Illegal option – r 退出状态: 1 sed -n ‘s/this/that/’ newfile 显示: sed: ERROR: Cannot open newfile: No such file or directory 退出状态: 2
sed -n ‘s/this/that’ newfile s/this/that 2. 正则表达式出错和模式不匹配: sed -n ‘s/this/that’ newfile 显示: sed: ERROR: Command garbled: s/this/that 退出状态: 0 sed -n ‘s/this/that/’ newfile 显示: 无 (文件中无this字符串匹配) 退出状态: 0
3. 出错信息保存和退出状态检测 特别强调: 命令运行结果放在标准输出上 fd = 1 缺省为荧光屏 出错信息放在标准错误输出上 ( 这两者的输出都是荧光屏, 有何区别? )
sed –n ‘1,$s/abc/xyz/’ file 2> err_log (这两条命令功能上的区别是什么?) 保存出错信息: sed –n ‘1,$s/abc/xyz/’ file 2> err_log 或: sed –n ‘1,$s/abc/xyz/’ file 2>> err_log (这两条命令功能上的区别是什么?) 检测退出状态: ① echo $? ② if [ $? -eq 0 ] 其它间接处理 then 正常处理 else 出错处理 fi
五. sed应用实例 打印文件内容: p命令 sed -n ‘22, 35p’ file1 打印file1的第22~35行 sed -n ‘/string/p’ file2 打印file2中包含string的行 sed -n ‘9, /^uestc/p’ file3 打印file3中第9行到以uestc开头的行 sed -n ‘/[Cc]hina/p’ file4 打印file4中包含China或china的行
(这几条命令的输出是什么? 加了任选项-n后又如何?) 2. 删除文件内容: d命令 sed ‘76d’ file5 删除file5中的第76行 sed ‘9,$d’ file6 删除file6中第8行以后的所有行 sed ‘/co*ool/d’ file7 删除file7中包含cool, coool, cooool ……等等的行 (这几条命令的输出是什么? 加了任选项-n后又如何?)
3. 替换文件内容: s命令 sed -n ‘s/beijing/shanghai/g’ table1 将table1中所有的beijing替换为shanghai sed -n ‘s/^ *uid/username/p’ ulist 将ulist中以零至多个空格开头后跟uid 的字符串替换为username 4. 多次编辑: e命令 sed -e ’1,5d’ -e ‘s/good/bad/’ report 将report中的第1~5行删除, 同时将good 替换为bad
this is an inserted line’ course 在course中的以operation开头的行后加入 sed ‘/^operation/a\ this is an inserted line’ course 在course中的以operation开头的行后加入 this is an inserted line一行 . course中有多行以operation开头时会怎样? . 不是另加一个新行, 而是在某行中加入字符串, 如 何操作? . 插入行不止一行, 而是多行怎么办?
特别说明: 不同的UNIX操作系统版本中, sed的格 式和语法可能有少量的差异, 使用时可 参照联机手册(man命令). 教材中的例子大部分是在C_shell下进 行的, 在B_shell或K_shell下可能有少量 的差异. 但这些差异只反映在shell命令 中, 而不会反映在编辑命令(表达式)中