没有合适的资源?快使用搜索试试~ 我知道了~
资源详情
资源评论
资源推荐
使用 sed 编辑器
作者:Emmett Dulaney
sed 编辑器是 Linux 系统管理员的工具包中最有用的资产之一,因此,有必要彻底地了解
其应用
Linux 操作系统最大的一个好处是它带有各种各样的实用工具。存在如此之多不同的实用工
具,几乎不可能知道并了解所有这些工具。可以简化关键情况下操作的一个实用工具是
sed。它是任何管理员的工具包中最强大的工具之一,并且可以证明它自己在关键情况下非
常有价值。
sed 实用工具是一个“编辑器”,但它与其它大多数编辑器不同。除了不面向屏幕之外,它
还是非交互式的。这意味着您必须将要对数据执行的命令插入到命令行或要处理的脚本中。
当显示它时,请忘记您在使用 Microsoft Word 或其它大多数编辑器时拥有的交互式编辑文
件功能。sed 在一个文件(或文件集)中非交互式、并且不加询问地接收一系列的命令并执
行它们。因而,它流经文本就如同水流经溪流一样,因而 sed 恰当地代表了流编辑器。它
可以用来将所有出现的 "Mr. Smyth" 修改为 "Mr. Smith",或将 "tiger cub" 修改为
"wolf cub"。流编辑器非常适合于执行重复的编辑,这种重复编辑如果由人工完成将花费大
量的时间。其参数可能和一次性使用一个简单的操作所需的参数一样有限,或者和一个具有
成千上万行要进行编辑修改的脚本文件一样复杂。sed 是 Linux 和 UNIX 工具箱中最有用
的工具之一,且使用的参数非常少。
sed 的工作方式
sed 实用工具按顺序逐行将文件读入到内存中。然后,它执行为该行指定的所有操作,并在
完成请求的修改之后将该行放回到内存中,以将其转储至终端。完成了这一行上的所有操作
之后,它读取文件的下一行,然后重复该过程直到它完成该文件。如同前面所提到的,默认
输出是将每一行的内容输出到屏幕上。在这里,开始涉及到 两个重要的因素—首先,输出
可以被重定向到另一文件中,以保存变化;第二,源文件(默认地)保持不被修改。sed 默
认读取整个文件并对其中的每一行进行修改。不过,可以按需要将操作限制在指定的行上。
该实用工具的语法为:
sed [options] '{command}' [filename]
在这篇文章中,我们将浏览最常用的命令和选项,并演示它们如何工作,以及它们适于在何
处使用。
替换命令
sed 实用工具以及其它任何类似的编辑器的最常用的命令之一是用一个值替换另一个值。用
来实现这一目的的操作的命令部分语法是:
's/{old value}/{new value}/'
因而,下面演示了如何非常简单地将 "tiger" 修改为 "wolf":
$ echo The tiger cubs will meet on Tuesday after school | sed 's/tiger/wolf/'
The wolf cubs will meet on Tuesday after school
$
注意如果输入是源自之前的命令输出,则不需要指定文件名—同样的原则也适用于 awk、
sort 和其它大多数 Linux\UNIX 命令行实用工具程序。
多次修改
如果需要对同一文件或行作多次修改,可以有三种方法来实现它。第一种是使用 "-e" 选项,
它通知程序使用了多条编辑命令。例如:
$ echo The tiger cubs will meet on Tuesday after school | sed -e ' s/tiger/wolf/' -e
's/after/before/'
The wolf cubs will meet on Tuesday before school
$
这是实现它的非常复杂的方法,因此 "-e" 选项不常被大范围使用。更好的方法是用分号来
分隔命令:
$ echo The tiger cubs will meet on Tuesday after school | sed 's/tiger/wolf/; s/after/before/'
The wolf cubs will meet on Tuesday before school
$
注意分号必须是紧跟斜线之后的下一个字符。如两者之间有一个空格,操作将不能成功完成,
并返回一条错误消息。这两种方法都很好,但许多管理员更喜欢另一种方法。要注意的一个
关键问题是,两个撇号 (' ') 之间的全部内容都被解释为 sed 命令。直到您输入了第二个
撇号,读入这些命令的 shell 程序才会认为您完成了输入。这意味着可以在多行上输入命令
—同时 Linux 将提示符从 PS1 变为一个延续提示符(通常为 ">")—直到输入了第二个撇
号。一旦输入了第二个撇号,并且按下了 Enter 键,则处理就进行并产生相同的结果,如下:
$ echo The tiger cubs will meet on Tuesday after school | sed '
> s/tiger/wolf/
> s/after/before/'
The wolf cubs will meet on Tuesday before school
$
全局修改
让我们开始一次看似简单的编辑。假定在要修改的消息中出现了多次要修改的项目。默认方
式下,结果可能和预期的有所不同,如下所示:
$ echo The tiger cubs will meet this Tuesday at the same time
as the meeting last Tuesday | sed 's/Tuesday/Thursday/'
The tiger cubs will meet this Thursday at the same time
as the meeting last Tuesday
$
与将出现的每个 "Tuesday" 修改为 "Thursday" 相反,sed 编辑器在找到一个要修改的项
目并作了修改之后继续处理下一行,而不读整行。sed 命令功能大体上类似于替换命令,这
意味着它们都处理每一行中出现的第一个选定序列。为了替换出现的每一个项目,在同一行
中出现多个要替换的项目的情况下, 您必须指定在全局进行该操作:
$ echo The tiger cubs will meet this Tuesday at the same time as the meeting last Tuesday | sed
's/Tuesday/Thursday/g' The tiger cubs will meet this Thursday at the same time as the meeting
last Thursday
$
请记住不管您要查找的序列是否仅包含一个字符或词组,这种对全局化的要求都是必需的。
sed 还可以用来修改记录字段分隔符。例如,以下命令将把所有的 tab 修改为空格:
sed 's/ / /g'
其中,第一组斜线之间的项目是一个 tab,而第二组斜线之间的项目是一个空格。作为一条
通用的规则,sed 可以用来将任意的可打印字符修改为任意其它的可打印字符。如果您想将
不可打印字符修改为可打印字符—例如,铃铛修改为单词 "bell"—sed 不是适于完成这项
工作的工具(但 tr 是)。
有时,您不想修改在一个文件中出现的所有指定项目。有时,您只想在满足某些条件时才作
修改—例如,在与其它一些数据匹配之后才作修改。为了说明这一点,请考虑以下文本文件:
$ cat sample_one
one 1
two 1
three 1
one 1
two 1
two 1
three 1
$
假定希望用 "2" 来替换 "1",但仅在单词 "two" 之后才作替换,而不是每一行的所有位置。
通过指定在给出替换命令之前必须存在一次匹配,可以实现这一点:
$ sed '/two/ s/1/2/' sample_one
one 1
two 2
three 1
one 1
two 2
two 2
three 1
$
现在,使其更加准确:
$ sed '
> /two/ s/1/2/
> /three/ s/1/3/' sample_one
one 1
two 2
three 3
one 1
two 2
two 2
three 3
$
请再次记住唯一改变了的是显示。如果您查看源文件,您将发现它始终保持不变。您必须将
输出保存至另一个文件,以实现永久保存。值得重复的是,不对源文件作修改实际是祸中有
福—它让您能够对文件进行试验而不会造成任何实际的损害,直到让正确命令以您预期和希
望 的方式进行工作。
以下命令将修改后的输出保存至一个新的文件:
$ sed '
> /two/ s/1/2/
> /three/ s/1/3/' sample_one > sample_two
剩余11页未读,继续阅读
白绍伟
- 粉丝: 13
- 资源: 287
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功
评论0