没有合适的资源?快使用搜索试试~ 我知道了~
资源推荐
资源详情
资源评论
《计算机软件基础》多媒体教程
第八讲
第二章 UNIX 的软件工具
2.4 sed
※ sed概述
sed(Streamer Editor)称为字符流编辑程序,是一个非交互式的文本编辑程序,作者为
Lee E. McMahon(李 麦克马洪• )。
适用于 sed 的情况为:
⊙ 不适合vi等交互编辑程序
有的文件行数太多或某些行的字符太多,使用 vi 时读入文件和写出文件的时间很长。
⊙ 全局编辑操作
对文件进行编辑的命令是事先确定的,并且适合于对文件进行全局编辑操作。或者命
令中含有的字符数较多,为避免在键入命令时出错而不宜于进行交互编辑。
⊙ shell编程
可以把 sed 命令写入 shell 程序。更多的情况是利用 sed 可以实现流水线操作。
※ sed的执行方式
⊙ 方式1
sed '
命令
' [
输入文件
] 或者
⊙ 方式2
sed -f
命令文件
[
输入文件
]
⊙ 功能
表示可以在 shell 命令行中执行 sed
命令
(用单引号括起)。-f 表示指定的
命令文件
中含
有 sed 命令,称为 sed 命令文件。如果缺省
输入文件
,sed 的输入将指向标准输入。sed
的输出如果不在 sed 命令中描述,则将输出(编辑的结果)送至标准输出。
在 sed 的工作流程中,如果有多个命令,这些命令将依次执行。每执行一个命令,总
是对搜索到的匹配行进行处理,连同不匹配的行(不予处理)一起生成中间文本,传递给
下一个命令,直至最后生成输出文件。
※ sed的命令格式
[addr1[,addr2]] [!] function[/cmd]<CR>
表示用 function(命令)处理由 addr1[,addr2] (地址表达式)匹配的行。
如果缺省 addr1[,addr2],表示对所有行执行 function。
如果加!,表示对不匹配 addr1[,addr2]的行执行 function。
cmd 表示命令的辅助功能。
由于 sed 的许多基本操作也是由 ed 程序的函数实现的,因此 sed 的 addr1[,addr2]和
function 均与 vi 的全局操作命令相同。
⊙ addr1[,addr2] (地址表达式,又称行地址address)
行号
匹配对应的行
/pattern/ 匹配/pattern/的行
addr1,addr2 从匹配 addr1 到匹配 addr2 之间的行
缺省 所有行
⊙ 常用的function(命令)
d 命令 删除由 pattern 匹配的行
s 命令 替换操作
⊙ cmd(s命令的辅助功能)
g 在同一行内执行所有可能的替换
p 如果替换操作完成的话,输出这一行
w file 将当前编辑文件输出到 file 中
【例2-14】sed命令示例(以a.txt为输入文件)。
sed '/The/d' a.txt 删除所有含字符串The的行
sed '/[0-9]/d' a.txt 删除所有含有数字的行
sed '/[a-z]/!d' a.txt 输出所有含小写字母的行(不删除)
sed '1,10d' a.txt 删除第1行到第10行
sed '5,$d' a.txt 输出第1行到第4行(不删除)
sed '/^#/,$d' a.txt 删除从第1个shell注释行到最后一行
sed '/\/\*/d' a.txt 删除含/*的行(C语言注释行)
sed '/^$/d' a.txt 删除所有空行
sed '/^#/s/Q/DFF/g' a.txt 以#开头的行将所有的Q替换为DFF
sed ‘s/$/\\/’ a.txt 在每个行尾都加上反斜杠 \
sed 's/^/\t/' a.txt 在每行前插入一个制表符
sed 's/if□\[/if□(/g' a.txt 将“if□[”替换为“if□(”
sed 's/printf(/f&stderr,/' a.txt 将“printf(”改为“fprintf(stderr,”
【例2-15】(课本例2-22)改变文件后缀示例。要求将当前目录下所有具有某个后缀的文件
全部重新命名,改为另一个后缀。为简单起见,将后缀为“.a”的文件改为后缀为“.b”的文件。
例如,执行命令“ls *.a”,显示当前命令下的文件为:
abc.a
de.a
xyz.a
如果执行以下命令:
mv abc.a abc.b
mv de.a de.b
mv zxy.a zxy.b
可以改变文件的后缀,获得以下文件:
abc.b
de.b
zxy.b
这样的操作属于手动执行 shell 命令。利用 sed 命令,编写 shell 程序(脚本文件),可以
实现非交互操作(batch program,批处理程序)。这是 UNIX 系统文件管理的一种基本操作。
以下讨论和介绍几种利用 sed 命令编程的方案。
⊙ 方案1
编写 shell 文件 cha2b_1,内容为:
ls□*.a□|□sed□'s/\.a$//' > a.tmp
for□i□in□`cat a.tmp`
do
mv□$i.a□$i.b
done
rm a.tmp
改变后缀的操作为:
$ cha2b_1
⊙ 方案2
如果不希望产生临时文件 a.tmp ,可以把 ls 命令和 sed 命令产生的结果赋给一个变量,
例如为 list,则 cha2b_2 为:
list=`ls□*.a□|□sed□'s/\.a$//' `
for□i□in□$list
do
mv□$i.a□$i.b
done
改变后缀的操作为:
$ cha2b_2
⊙ 方案3
考虑到 for 循环执行的命令为:
mv abc.a abc.b
mv de.a de.b
mv zxy.a zxy.b
可以用 sed 替代 for 循环来产生 shell 文件,将 cha2b_2 改写为 cha2b_3,内容为:
ls□*.a□| \
sed□'s/\.a$//'□| \ (1)
sed□'s/.*/mv□&.a□&.b/' > cha2b_3.sh (2)
其中,“.*”表示一行中的所有文字,替换结果中的“&”是引用无名宏。执行命令为:
$ cha2b_3 生成 shell 文件 cha2b_3.sh
$ cha2b_3.sh 运行 shell 文件 cha2b_3.sh
【例2-16】用sed命令修改文件示例。
例如,输入文件in3为:
# file1
0. stdin: Standard file in
# file2
2. stderr: Standard file err
# file3
1. stdout: Standard file out
希望得到输出文件out3为:
# file1
000: standard in
# file2
222: standard err
# file3
111: standard out
以下讨论和介绍几种利用sed命令编程的方案。
⊙ 方案1(用两行sed命令,产生临时文件a.tmp)
$ sed 's/std.*file/standard/' < in3 > a.tmp
$ sed 's/^\([0-2]\)\./\1\1\1:/' < a.tmp > out3
⊙ 方案2(采用流水线,不产生临时文件)
$ sed 's/std.*file/standard/' < in3 | \
剩余12页未读,继续阅读
资源评论
wxg520cxl
- 粉丝: 24
- 资源: 3万+
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功