下载
第10章 sed 用 法 介 绍
sed是一个非交互性文本流编辑器。它编辑文件或标准输入导出的文本拷贝。标准输入可
能是来自键盘、文件重定向、字符串或变量,或者是一个管道的文本。 sed可以做些什么呢?
别忘了,Vi也是一个文本编辑器。 sed可以随意编辑小或大的文件,有许多 sed命令用来编辑、
删除,并允许做这项工作时不在现场。 sed一次性处理所有改变,因而变得很有效,对用户来
讲,最重要的是节省了时间。
本章内容有:
抽取域。
匹配正则表达式。
比较域。
增加、附加、替换。
基本的sed命令和一行脚本。
可以在命令行输入sed命令,也可以在一个文件中写入命令,然后调用 sed,这与awk基本
相同。使用sed需要记住的一个重要事实是,无论命令是什么, sed并不与初始化文件打交道,
它操作的只是一个拷贝,然后所有的改动如果没有重定向到一个文件,将输出到屏幕。
因为sed是一个非交互性编辑器,必须通过行号或正则表达式指定要改变的文本行。
本章介绍sed用法和功能。本章大多编写的是一行命令和小脚本。这样做可以慢慢加深对
sed用法的了解,取得宝贵的经验,以便最终自己编出大的复杂 sed脚本。
和grep与awk一样,sed是一种重要的文本过滤工具,或者使用一行命令或者使用管道与
grep与awk相结合。
10.1 sed怎样读取数据
sed从文件的一个文本行或从标准输入的几种格式中读取数据,将之拷贝到一个编辑缓冲
区,然后读命令行或脚本的第一条命令,并使用这些命令查模式或定位行号编辑它。重复
此过程直到命令结束。
10.2 调用sed
调用sed有三种方式:在命令行键入命令;将 sed命令插入脚本文件,然后调用 sed;将sed
命令插入脚本文件,并使sed脚本可执行。
使用sed命令行格式为:
sed [选项] sed命令 输入文件。
记住在命令行使用sed命令时,实际命令要加单引号。sed也允许加双引号。
使用sed脚本文件,格式为:
sed [选项] -f sed脚本文件 输入文件
要使用第一行具有sed命令解释器的sed脚本文件,其格式为:
90
第二部分 文 本 过 滤
下载
sed脚本文件 [选项] 输入文件
不管是使用shell命令行方式或脚本文件方式,如果没有指定输入文件, sed从标准输入中
接受输入,一般是键盘或重定向结果。
sed选项如下:
n 不打印;sed不写编辑行到标准输出,缺省
为打印所有行(编辑和未编辑)。p命令可以
用来打印编辑行。
c 下一命令是编辑命令。使用多项编辑时加入此选项。如果只用到一条 sed命令,
此选项无用,但指定它也没有关系。
f 如果正在调用sed脚本文件,使用此选项。此选项通知 sed一个脚本文件支持所有的 sed
命令,例如:sed -f myscript.sed input_file,这里myscript.sed即为支持sed命令的文件。
10.2.1 保存sed输出
由于不接触初始化文件,如果想要保存改动内容,简单地将所有输出重定向到一个文件
即可。下面的例子重定向 sed命令的所有输出至文件‘ myoutfile’,当对结果很满意时使用这
种方法。
10.2.2 使用sed在文件中查询文本的方式
sed浏览输入文件时,缺省从第一行开始,有两种方式定位文本:
1) 使用行号,可以是一个简单数字,或是一个行号范围。
2) 使用正则表达式,怎样构建这些模式请参见第 7章。
表10-1给出使用sed定位文本的一些方式。
表10-1 使用sed在文件中定位文本的方式
x x为一行号,如 1
x,y 表示行号范围从x到y,如2,5表示从第2行到第5行
/pattern/ 查询包含模式的行。例如/disk/或/[a-z]/
/pattern/pattern/ 查询包含两个模式的行。例如/disk/disks/
pattern/,x 在给定行号上查询包含模式的行。如 /ribbon/,3
x,/pattern/ 通过行号和模式查询匹配行。3./vdu/
x,y! 查询不包含指定行号x和y的行。1,2!
10.2.3 基本sed编辑命令
表10-2列出了Sed的编辑命令。
表10-2 sed编辑命令
p 打印匹配行
= 显示文件行号
a\ 在定位行号后附加新文本信息
i\ 在定位行号后插入新文本信息
d 删除定位行
c\ 用新文本替换定位文本
91
第10章 sed 用 法 介 绍
下载
(续)
s 使用替换模式替换相应模式
r 从另一个文件中读文本
w 写文本到一个文件
q
第一个模式匹配完成后推出或立即推出
l 显示与八进制ASCII代码等价的控制字符
{} 在定位行执行的命令组
n 从另一个文件中读文本下一行,并附加在下一行
g 将模式2粘贴到/pattern n/
y 传送字符
n 延续到下一输入行;允许跨行的模式匹配语句
如果不特别声明,sed例子中使用下述文本文件。
10.3 sed和正则表达式
sed识别任何基本正则表达式和模式及其行匹配规则。记住规则之一是:如果要定位一特
殊字符,必须使用(\)屏蔽其特殊含义,如有必要请参照第 7章正则表达式。第7章使用的所
有正则表达式在sed中都是合法的。
10.4 基本sed编程举例
下面通过例子实际检验一下sed的编辑功能。
10.4.1 使用p(rint)显示行
print命令格式为[address[,address]P。显示文本行必须提供sed命令行号。
错误在哪儿?原意只打印第二行,但是却打印了文件中所有行,为此需使用 -n选项,显
示打印定位(匹配)行。
10.4.2 打印范围
可以指定行的范围,现打印1到3行,用逗号分隔行号。
92
第二部分 文 本 过 滤
下载
10.4.3 打印模式
假定要匹配单词Neave,并打印此行,方法如下。使用模式 /pattern/格式,这里为/Neave/。
10.4.4 使用模式和行号进行查询
为编辑某个单词浏览一个文件时, sed返回包含指定单词的许多行。怎样使返回结果更精
确以满足模式匹配呢?可以将行号和模式结合使用。下面这个例子,假定要改动文件
最后一行中的单词the,使用sed查询the,返回两行:
使用模式与行号的混合方式可以剔除第一行,格式为 line_number,/pattern/。逗号用来分
隔行号与模式开始部分。为达到预期结果,使用 4,/the/。意即只在第四行查询模式 the,命令
如下:
10.4.5 匹配元字符
匹配元字符$前,必须使用反斜线\屏蔽其特殊含义。模式为/\$/ p。
10.4.6 显示整个文件
要打印整个文件,只需将行范围设为第一行到最后一行 1,$。$意为最后一行。
10.4.7 任意字符
匹配任意字母,后跟任意字母的 0次或多次重复,并以ing结尾,模式为/.*ing/。可以使用
这个模式查询以ing结尾的任意单词。
10.4.8 首行
要打印文件第一行,使用行号:
93
第10章 sed 用 法 介 绍
下载
10.4.9 最后一行
要打印最后一行,使用$。$是代表最后一行的元字符。
10.4.10 打印行号
要打印行号,使用等号=。打印模式匹配的行号,使用格式 /pattern/=。
整个文件都打印出来,并且匹配行打印了行号。如果只关心实际行号,使用 -e选项。
如果只打印行号及匹配行,必须使用两个 sed命令,并使用e选项。第一个命令打印模式
匹配行,第二个使用=选项打印行号,格式为sed -n -e /pattern/p -e /pattern/=。
10.4.11 附加文本
要附加文本,使用符号a\,可以将指定文本一行或多行附加到指定行。如果不指定文本放
置位置,sed缺省放在每一行后面。附加文本时不能指定范围,只允许一个地址模式。文本附
加操作时,结果输出在标准输出上。注意它不能被编辑,因为 sed执行时,首先将文件的一行
文本拷贝至缓冲区,在这里 sed编辑命令执行所有操作(不是在初始文件上),因为文本直接
输出到标准输出,sed并无拷贝。
要想在附加操作后编辑文本,必须保存文件,然后运行另一个 sed命令编辑它。这时文件
的内容又被移至缓冲区。
附加操作格式如下:
地址指定一个模式或行号,定位新文本附加位置。 a\ 通知sed对a\后的文本进行实际附加
操作。观察格式,注意每一行后面有一斜划线,这个斜划线代表换行。 sed执行到这儿,将创
建一新行,然后插入下一文本行。最后一行不加斜划线, sed假定这是附加命令结尾。
正则匹配中配到到带单引号当附加或插入文本或键入几个 sed命令时,可以利用辅助的 shell提示符以输入多行命令。
这里没有这样做,因为可以留给使用者自己编写,并且在一个脚本文件中写这样的语句更适
宜。现在马上讲述sed脚本文件。另外,脚本可以加入空行和注释行以增加可读性。
94
第二部分 文 本 过 滤
下载
10.4.12 创建sed脚本文件
要创建脚本文件append.sed,输入下列命令:
保存它,增加可执行权限:
运行,
如果返回‘file not found’,试在脚本前加入.\。
现在查看其具体功能。第一行是 sed命令解释行。脚本在这一行查 sed以运行命令,这里
定位在/bin。
第二行以/company/开始,这是附加操作起始位置。 a\通知sed这是一个附加操作,首先
应插入一个新行。第三行是附加操作要加入到拷贝的实际文
本。
输出显示附加结果。如果要保存输出,重定向到一个文件。
10.4.13 插入文本
插入命令类似于附加命令,只是在指定行前面插入。和附加命令一样,它也只接受一个
地址。下面是插入命令的一般格式。地址是匹配模式或行号:
下面例子在以attendance结尾的行前插入文本utter confusion followed。
运行结果是:
95
第10章 sed 用 法 介 绍
下载
也可以使用行号指定文本插入位置,插入位置在模式或指定行号 4之前。脚本如下:
10.4.14 修改文本
修改命令将在匹配模式空间的指定行用新文本加以替代,格式如下:
将第一行The honeysuckle band played all night long for only $90替换为The office Dibble
band played well。首先要匹配第一行的任何部分,可使用模式‘ /Honeysuckle/’。sed脚本文
件为change.sed。内容如下:
运行它,不要忘了给脚本增加可执行权限。 chmod u+x change.sed。
像插入动作一样,可以使用行号代替模式,两种方式完成相同的功能。
可以对同一个脚本中的相同文件进行修改、附加、插入三种动作匹配和混合操作。
下面是一个带有注释的脚本例子。
96
第二部分 文 本 过 滤
下载
运行它,结果如下:
10.4.15 删除文本
sed删除文本格式:
[address[,address]]d
地址可以是行的范围或模式,让我们看几个例子。
删除第一行;1d意为删除第一行。
删除第一到第三行:
删除最后一行:
也可以使用正则表达式进行删除操作。下面的例子删除包含文本‘ Neave’的行。
10.4.16 替换文本
替换命令用替换模式替换指定模式,格式为:
[address[,address]] s/ pattern-to-find /replacement-pattern/[g p w n]
s选项通知sed这是一个替换操作,并查询 pattern-to-find,成功后用replacement-pattern替
换它。
替换选项如下:
g 缺省情况下只替换第一次出现模式,使用 g选项替换全局所有出现模式。
p 缺省sed将所有被替换行写入标准输出,加 p选项将使-n选项无效。-n选项不打印输出
结果。
w 文件名 使用此选项将输出定向到一个文件。
97
第10章 sed 用 法 介 绍
下载
让我们看几个
例子。替换 night为NIGHT,首先查询模式 night,然后用文本NIGHT替换
它。
要从 $90中删除 $符号(记住这是一个特殊符号,必须用 \屏蔽其特殊含义),在
replacement-pattern部分不写任何东西,保留空白,但仍需要用斜线括起来。在 sed中也可以这
样删除一个字符串。
要进行全局替换,即替换所有出现模式,只需在命令后加 g选项。下面的例子将所有 The
替换成Wow!。
将替换结果写入一个文件用 w选项,下面的例子将 splendid替换为SPLENDID的替换结果
写入文件sed.out:
注意要将文件名括在sed的单引号里。文件结果如下:
10.5 使用替换修改字符串
如果要附加或修改一个字符串,可以使用( &)命令,&命令保存发现模式以便重新调用
它,然后把它放在替换字符串里面。这里给出一个修改的设计思路。先给出一个被替换模式,
然后是一个准备附加在第一个模式后的另一个模式,并且后面带有 &,这样修改模式将放在
匹配模式之前。例如,sed语句s/nurse/"Hello"&/p 的结果如下:
原句是文本行The local nurse Miss P.Neave was in attendance。
记住模式中要使用空格,因为输出结果表明应加入空格。
还有一个例子:
原句是The honeysuckle band played all night long for only $90。相信这种修改动作已经讲
解得很清楚了。
10.6 将sed结果写入文件命令
像使用>文件重定向发送输出到一个文件一样,在 sed命令中也可以将结果输入文件。格
式有点像使用替换命令:
98
第二部分 文 本 过 滤
下载
[address[,address]]w filename
‘w’选项通知sed将结果写入文件。filename是自解释文件名。下面有两个例子。
文件输出到屏幕。模式范围即1,2行输出到文件filedt。
下面例子中查询模式Neave,匹配结果行写入文件filedht。
10.7 从文件中读文本
处理文件时,sed允许从另一个文件中读文本,并将其文本附加在当前文件。此命令放在
模式匹配行后,格式为:
address r filename
这里r通知sed将从另一个文件源中读文本。filename是其文件名。
现在创建一个小文件,内容如下:
将内容附加到文件的拷贝。在模式匹配行/company/后放置附加文本。本
例为第三行。注意所读的文件名需要用单引号括起来。
10.8 匹配后退出
有时需要在模式匹配首次出现后退出 sed,以便执行其他处理脚本。退出命令格式为:
address q
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论