Linux使用命令详解SED文档格式.docx

上传人:b****6 文档编号:17184545 上传时间:2022-11-28 格式:DOCX 页数:15 大小:23.52KB
下载 相关 举报
Linux使用命令详解SED文档格式.docx_第1页
第1页 / 共15页
Linux使用命令详解SED文档格式.docx_第2页
第2页 / 共15页
Linux使用命令详解SED文档格式.docx_第3页
第3页 / 共15页
Linux使用命令详解SED文档格式.docx_第4页
第4页 / 共15页
Linux使用命令详解SED文档格式.docx_第5页
第5页 / 共15页
点击查看更多>>
下载资源
资源描述

Linux使用命令详解SED文档格式.docx

《Linux使用命令详解SED文档格式.docx》由会员分享,可在线阅读,更多相关《Linux使用命令详解SED文档格式.docx(15页珍藏版)》请在冰豆网上搜索。

Linux使用命令详解SED文档格式.docx

不过,可以按需要将操作限制在指定的行上。

该实用工具的语法为:

sed[options]'

{command}'

[filename]

在这篇文章中,我们将浏览最常用的命令和选项,并演示它们如何工作,以及它们适于在何处使用。

替换命令

sed实用工具以及其它任何类似的编辑器的最常用的命令之一是用一个值替换另一个值。

用来实现这一目的的操作的命令部分语法是:

'

s/{oldvalue}/{newvalue}/'

因而,下面演示了如何非常简单地将"

tiger"

wolf"

$echoThetigercubswillmeetonTuesdayafterschool|sed

s/tiger/wolf/'

ThewolfcubswillmeetonTuesdayafterschool

$

注意如果输入是源自之前的命令输出,则不需要指定文件名—同样的原则也适用于awk、sort和其它大多数Linux\UNIX命令行实用工具程序。

多次修改

如果需要对同一文件或行作多次修改,可以有三种方法来实现它。

第一种是使用"

-e"

选项,它通知程序使用了多条编辑命令。

例如:

$echoThetigercubswillmeetonTuesdayafterschool|sed-e'

-e'

s/after/before/'

ThewolfcubswillmeetonTuesdaybeforeschool

这是实现它的非常复杂的方法,因此"

选项不常被大范围使用。

更好的方法是用分号来分隔命令:

$echoThetigercubswillmeetonTuesdayafterschool|sed'

s/tiger/wolf/;

s/after/before/'

注意分号必须是紧跟斜线之后的下一个字符。

如果两者之间有一个空格,操作将不能成功完成,并返回一条错误消息。

这两种方法都很好,但许多管理员更喜欢另一种方法。

要注意的一个关键问题是,两个撇号('

'

)之间的全部内容都被解释为sed命令。

直到您输入了第二个撇号,读入这些命令的shell程序才会认为您完成了输入。

这意味着可以在多行上输入命令—同时Linux将提示符从PS1变为一个延续提示符(通常为"

>

"

)—直到输入了第二个撇号。

一旦输入了第二个撇号,并且按下了Enter键,则处理就进行并产生相同的结果,如下所示:

s/tiger/wolf/

全局修改

让我们开始一次看似简单的编辑。

假定在要修改的消息中出现了多次要修改的项目。

默认方式下,结果可能和预期的有所不同,如下所示:

$echoThetigercubswillmeetthisTuesdayatthesametime

asthemeetinglastTuesday|

sed'

s/Tuesday/Thursday/'

ThetigercubswillmeetthisThursdayatthesametime

asthemeetinglastTuesday

与将出现的每个"

Tuesday"

Thursday"

相反,sed编辑器在找到一个要修改的项目并作了修改之后继续处理下一行,而不读整行。

sed命令功能大体上类似于替换命令,这意味着它们都处理每一行中出现的第一个选定序列。

为了替换出现的每一个项目,在同一行中出现多个要替换的项目的情况下,您必须指定在全局进行该操作:

asthemeetinglastTuesday|

s/Tuesday/Thursday/g'

asthemeetinglastThursday

请记住不管您要查找的序列是否仅包含一个字符或词组,这种对全局化的要求都是必需的。

sed还可以用来修改记录字段分隔符。

例如,以下命令将把所有的tab修改为空格:

s///g'

其中,第一组斜线之间的项目是一个tab,而第二组斜线之间的项目是一个空格。

作为一条通用的规则,sed可以用来将任意的可打印字符修改为任意其它的可打印字符。

如果您想将不可打印字符修改为可打印字符—例如,铃铛修改为单词"

bell"

—sed不是适于完成这项工作的工具(但tr是)。

有时,您不想修改在一个文件中出现的所有指定项目。

有时,您只想在满足某些条件时才作修改—例如,在与其它一些数据匹配之后才作修改。

为了说明这一点,请考虑以下文本文件:

$catsample_one

one1

two1

three1

假定希望用"

2"

来替换"

1"

,但仅在单词"

two"

之后才作替换,而不是每一行的所有位置。

通过指定在给出替换命令之前必须存在一次匹配,可以实现这一点:

$sed'

/two/s/1/2/'

sample_one

two2

现在,使其更加准确:

/two/s/1/2/

/three/s/1/3/'

three3

请再次记住唯一改变了的是显示。

如果您查看源文件,您将发现它始终保持不变。

您必须将输出保存至另一个文件,以实现永久保存。

值得重复的是,不对源文件作修改实际是祸中有福—它让您能够对文件进行试验而不会造成任何实际的损害,直到让正确命令以您预期和希望的方式进行工作。

以下命令将修改后的输出保存至一个新的文件:

sample_one>

sample_two

该输出文件将所有修改合并在其中,并且这些修改通常将在屏幕上显示。

现在可以用head、cat或任意其它类似的实用工具来进行查看。

脚本文件

sed工具允许您创建一个脚本文件,其中包含从该文件而不是在命令行进行处理的命令,并且sed工具通过"

-f"

选项来引用。

通过创建一个脚本文件,您能够一次又一次地重复运行相同的操作,并指定比每次希望从命令行进行处理的操作详细得多的操作。

考虑以下脚本文件:

$catsedlist

/two/s/1/2/

/three/s/1/3/

现在可以在数据文件上使用脚本文件,获得和我们之前看到的相同的结果:

$sed-fsedlistsample_one

注意当调用"

选项时,在源文件内或命令行中不使用撇号。

脚本文件,也称为源文件,对于想重复多次的操作和从命令行运行可能出错的复杂命令很有价值。

编辑源文件并修改一个字符比在命令行中重新输入一条多行的项目要容易得多。

限制行

编辑器默认查看输入到流编辑器中的每一行,且默认在输入到流编辑器中的每一行上进行编辑。

这可以通过在发出命令之前指定约束条件来进行修改。

例如,只在此示例文件的输出的第5和第6行中用"

,命令将为:

5,6s/1/2/'

在这种情况下,因为要修改的行是专门指定的,所以不需要替换命令。

因此,您可以灵活地根据匹配准则(可以是行号或一种匹配模式)来选择要修改哪些行(从根本上限制修改)。

禁止显示

sed默认将来自源文件的每一行显示到屏幕上(或重定向到一个文件中),而无论该行是否受到编辑操作的影响,"

-n"

参数覆盖了这一操作。

覆盖了所有的显示,并且不显示任何一行,而无论它们是否被编辑操作修改。

$sed-n-fsedlistsample_one

$sed-n-fsedlistsample_one>

$catsample_two

在第一个示例中,屏幕上不显示任何东西。

在第二个示例中,不修改任何东西,因此不将任何东西写到新的文件中—它最后是空的。

这不是否定了编辑的全部目的吗?

为什么这是有用的?

它是有用的仅因为"

选项能够被一条显示命令(-p)覆盖。

为了说明这一点,假定现在像下面这样对脚本文件进行了修改:

/two/s/1/2/p

/three/s/1/3/p

然后下面是运行它的结果:

保持不变的行全部不被显示。

只有受到编辑操作影响的行被显示了。

在这种方式下,可以仅取出这些行,进行修改,然后把它们放到一个单独的文件中:

利用它的另一种方法是只显示一定数量的行。

例如,只显示2-6行,同时不做其它的编辑修改:

$sed-n'

2,6p'

其它所有的行被忽略,只有2-6行作为输出显示。

这是一项出色的功能,其它任何工具都不能容易地实现。

Head将显示一个文件的顶部,而tail将显示一个文件的底部,但sed允许从任意位置取出想要的任意内容。

删除行

用一个值替换另一个值远非流编辑器可以执行的唯一功能。

它还具有许多的潜在功能,在我看来第二种最常用的功能是删除。

删除与替换的工作方式相同,只是它删除指定的行(如果您想要删除一个单词而不是一行,不要考虑删除,而应考虑用空的内容来替换它—s/cat//)。

该命令的语法是:

{whattofind}d'

从sample_one文件中删除包含"

的所有行:

/two/d'

从显示屏中删除前三行,而不管它们的内容是什么:

1,3d'

只显示剩下的行,前三行不在显示屏中出现。

对于流编辑器,一般当它们涉及到全局表达式时,特别是应用于删除操作时,有几点要记住:

上三角号(^)表示一行的开始,因此,如果"

是该行的头三个字符,则

/^two/d'

将只删除该行。

美元符号($)代表文件的结尾,或一行的结尾,因此,如果"

是该行的最后三个字符,则

/two$/d'

将这两者结合在一起的结果:

/^$/d'

{filename}

删除文件中的所有空白行。

例如,以下命令将"

替换为"

,以及将"

3"

,并删除文件中所有尾随的空行:

/two/s/1/2/;

/three/s/1/3/;

/^$/d'

其通常的用途是删除一个标题。

以下命令将删除文件中所有的行,从第一行直到第一个空行:

1,/^$/d'

添加和插入文本

可以结合使用sed和"

a"

选项将文本添加到一个文件的末尾。

实现方法如下:

$a\

Thisiswherewestop\

thetest'

Thisiswherewestop

thetest

在该命令中,美元符号($)表示文本将被添加到文件的末尾。

反斜线(\)是必需的,它表示将插入一个回车符。

如果它们被遗漏了,则将导致一个错误,显示该命令是错乱的;

在任何要输入回车的地方您必须使用反斜线。

要将这些行添加到第4和第5个位置而不是末尾,则命令变为:

3a\

这将文本添加到第3行之后。

和几乎所有的编辑器一样,您可以选择插入而不是添加(如果您希望这样的话)。

这两者的区别是添加跟在指定的行之后,而插入从指定的行开始。

当用插入来代替添加时,只需用"

i"

来代替"

,如下所示:

3i\

新的文本出现在输出的中间位置,而处理通常在指定的操作执行以后继续进行。

读写文件

重定向输出的功能已经演示过了,但需要指出的是,在编辑命令运行期间可以同步地读入和写出文件。

例如,执行替换,并将1-3行写到名称为sample_three的文件中:

/three/s/1/3/

1,3wsample_three'

$catsample_three

由于为w(write)命令指定了"

1,3"

,所以只有指定的行被写到了新文件中。

无论被写的是哪些行,所有的行都在默认输出中显示。

修改命令

除了替换项目之外,还可以将行从一个值修改为另一个值。

要记住的是,替换是对字符逐个进行,而修改功能与删除类似,它影响整行:

/two/c\

Wearenolongerusingtwo'

Wearenolongerusingtwo

修改命令与替换的工作方式很相似,但在范围上要更大些—将一个项目完全替换为另一个项目,而无论字符内容或上下文。

夸张一点讲,当使用替换时,只有字符"

被字符"

替换,而当使用修改时,原来的整行将被修改。

在两种情况下,要寻找的匹配条件都仅为"

修改全部但……

对于大多数sed命令,详细说明各种功能要进行何种修改。

利用感叹号,可以在除指定位置之外的任何地方执行修改—与默认的操作完全相反。

例如,要删除包含单词"

的所有行,操作为:

而要删除除包含单词"

的行之外的所有行,则语法变为:

/two/!

d'

如果您有一个文件包含一系列项目,并且想对文件中的每个项目执行一个操作,那么首先对那些项目进行一次智能扫描并考虑将要做什么是很重要的。

为了使事情变得更简单,您可以将sed与任意迭代例程(for、while、until)结合来实现这一目的。

比如说,假定您有一个名为"

animals"

的文件,其中包含以下项目:

pig

horse

elephant

cow

dog

cat

您希望运行以下例程:

#mcd.ksh

forIin$*

do

echoOldMcDonaldhada$I

echoE-I,E-I-O

done

结果将为,每一行都显示在"

OldMcDonaldhasa"

的末尾。

虽然对于这些项目的大部分这是正确的,但对于"

elephant"

项目,它有语法错误,因为结果应当为"

anelephant"

而不是"

aelephant"

利用sed,您可以在来自shell文件的输出中检查这种语法错误,并通过首先创建一个命令文件来即时地更正它们:

#sublist

/aa/s/a/an/

/ae/s/a/an/

/ai/s/a/an/

/ao/s/a/an/

/au/s/a/an/

然后执行以下过程:

$shmcd.ksh'

catanimals'

|sed-fsublist

现在,在运行了mcd脚本之后,sed将在输出中搜索单个字母a(空格,"

,空格)之后紧跟了一个元音的任意位置。

如果这种位置存在,它将把该序列修改为空格,"

an"

,空格。

这样就使问题更正后才显示在屏幕上,并确保各处的编辑人员在晚上可以更容易地入睡。

结果是:

OldMcDonaldhadapig

E-I,E-I-O

OldMcDonaldhadahorse

OldMcDonaldhadanelephant

OldMcDonaldhadacow

OldMcDonaldhadadog

OldMcDonaldhadacat

提前退出

sed默认读取整个文件,并只在到达末尾时才停止。

不过,您可以使用退出命令提前停止处理。

只能指定一条退出命令,而处理将一直持续直到满足调用退出命令的条件。

例如,仅在文件的前五行上执行替换,然后退出:

5q'

在退出命令之前的项目可以是一个行号(如上所示),或者一条查找/匹配命令:

/two/s

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > PPT模板 > 动物植物

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1