sed新人易学

合集下载

sed 命令用法

sed 命令用法

sed 命令用法Sed命令是一种非常强大的文本处理工具,它可以用来编辑、转换、替换文本文件中的内容。

在本文中,我们将介绍Sed命令的用法,包括基本用法、高级用法和实际应用。

基本用法Sed命令的基本用法非常简单,它可以用来替换文本文件中的字符串。

例如,我们可以使用以下命令将文件中的“hello”替换为“world”:sed 's/hello/world/g' filename在这个命令中,“s”表示替换操作,“hello”是要被替换的字符串,“world”是要替换成的字符串,“g”表示全局替换。

除了替换操作,Sed命令还可以用来删除行、插入行、追加行等操作。

例如,我们可以使用以下命令删除文件中的第5行:sed '5d' filename在这个命令中,“5d”表示删除第5行。

高级用法除了基本用法,Sed命令还有一些高级用法,可以更加灵活地处理文本文件。

例如,我们可以使用正则表达式来匹配字符串。

例如,我们可以使用以下命令将文件中所有以“http”开头的行删除:sed '/^http/d' filename在这个命令中,“/^http/”表示匹配以“http”开头的行,“d”表示删除匹配的行。

Sed命令还可以使用分隔符来替换字符串。

例如,我们可以使用以下命令将文件中的“hello”替换为“world”:sed 's|hello|world|g' filename在这个命令中,“|”是分隔符,用来替换“/”。

实际应用Sed命令在实际应用中非常广泛,可以用来处理各种文本文件。

例如,我们可以使用Sed命令来批量修改文件名。

例如,我们可以使用以下命令将所有以“.txt”结尾的文件名中的“old”替换为“new”:for file in *.txt; do mv "$file" "$(echo $file | sed 's/old/new/g')"; done在这个命令中,“for file in *.txt”表示遍历所有以“.txt”结尾的文件,“mv”表示重命名文件,“$(echo $file | sed 's/old/new/g')”表示将文件名中的“old”替换为“new”。

sed命令的使用方法

sed命令的使用方法

sed命令的使用方法【原创实用版3篇】目录(篇1)1.sed 命令简介2.sed 命令的基本语法3.sed 命令的常用选项4.sed 命令的应用实例正文(篇1)【sed 命令简介】sed(Stream Editor)是一种流编辑器,用于对文本文件进行处理。

它可以对文本文件进行替换、删除、插入等操作,功能非常强大。

sed 命令在 Linux 和 Unix 系统中广泛使用,对于文本文件的处理非常方便。

【sed 命令的基本语法】sed 命令的基本语法如下:```sed [选项] 脚本```其中,脚本是用于指定 sed 命令操作的文本文件。

sed 命令会按照脚本中的指令对输入文件进行处理,并将结果输出到标准输出设备(通常是屏幕)。

【sed 命令的常用选项】以下是一些常用的 sed 命令选项:- -i:用于在原始文件上进行修改,而不是创建一个新的输出文件。

- -n:用于只输出与脚本匹配的行。

- -v:用于显示脚本的详细输出信息。

- -r:用于递归地处理目录中的所有文件。

- -e:用于指定一个或多个脚本。

【sed 命令的应用实例】以下是一些 sed 命令的应用实例:1.替换:将文本文件中的所有“hello”替换为“world”。

```sed "s/hello/world/" input.txt > output.txt```2.删除:删除文本文件中的所有空行。

```sed "/^$/d" input.txt > output.txt```3.插入:在文本文件的每一行末尾插入一个字符串。

```sed "s/$/abc/" input.txt > output.txt```4.筛选:只输出文本文件中包含特定字符串的行。

```sed "/hello/p" input.txt > output.txt```【结语】sed 命令是一种非常实用的文本处理工具,它可以帮助我们对文本文件进行各种复杂的操作。

sed学习集锦

sed学习集锦

使用 sed 编辑器Linux 操作系统最大的一个好处是它带有各种各样的实用工具。

存在如此之多不同的实用工具,几乎不可能知道并了解所有这些工具。

可以简化关键情况下操作的一个实用工具是 sed。

它是任何管理员的工具包中最强大的工具之一,并且可以证明它自己在关键情况下非常有价值。

sed 实用工具是一个“编辑器”,但它与其它大多数编辑器不同。

除了不面向屏幕之外,它还是非交互式的。

这意味着您必须将要对数据执行的命令插入到命令行或要处理的脚本中。

当显示它时,请忘记您在使用 Microsoft Word 或其它大多数编辑器时拥有的交互式编辑文件功能。

sed 在一个文件(或文件集)中非交互式、并且不加询问地接收一系列的命令并执行它们。

因而,它流经文本就如同水流经溪流一样,因而 sed 恰当地代表了流编辑器。

它可以用来将所有出现的 "Mr. Smyth" 修改为 "Mr. Smith",或将 "tiger cub" 修改为 "wolf cub"。

流编辑器非常适合于执行重复的编辑,这种重复编辑如果由人工完成将花费大量的时间。

其参数可能和一次性使用一个简单的操作所需的参数一样有限,或者和一个具有成千上万行要进行编辑修改的脚本文件一样复杂。

sed 是 Linux 和 UNIX 工具箱中最有用的工具之一,且使用的参数非常少。

sed 的工作方式sed 实用工具按顺序逐行将文件读入到内存中。

然后,它执行为该行指定的所有操作,并在完成请求的修改之后将该行放回到内存中,以将其转储至终端。

完成了这一行上的所有操作之后,它读取文件的下一行,然后重复该过程直到它完成该文件。

如同前面所提到的,默认输出是将每一行的内容输出到屏幕上。

在这里,开始涉及到两个重要的因素—首先,输出可以被重定向到另一文件中,以保存变化;第二,源文件(默认地)保持不被修改。

sed 默认读取整个文件并对其中的每一行进行修改。

sed命令练习题

sed命令练习题

sed命令练习题一、基础操作1. 将文件file.txt中的所有"apple"替换为"banana",并将结果输出到屏幕。

2. 将文件file.txt中的所有以"apple"开头的行删除,并将结果保存到文件newfile.txt中。

3. 将文件file.txt中的所有以"apple"开头的行删除,并将结果输出到屏幕。

二、高级操作1. 将文件file.txt中的第二行的"apple"替换为"banana",并将结果输出到屏幕。

2. 将文件file.txt中的第二行的"apple"替换为"banana",并将结果保存到文件newfile.txt中。

3. 将文件file.txt中的最后一行的"apple"替换为"banana",并将结果输出到屏幕。

4. 将文件file.txt中的所有"apple"替换为"banana",并将结果保存到文件newfile.txt中。

5. 将文件file.txt中的所有以"apple"开头的行删除,并将结果输出到屏幕。

6. 将文件file.txt中的所有以"apple"开头的行删除,并将结果保存到文件newfile.txt中。

三、进阶操作1. 将文件file.txt中含有"apple"的行的下一行插入"banana",并将结果输出到屏幕。

2. 将文件file.txt中含有"apple"的行的下一行插入"banana",并将结果保存到文件newfile.txt中。

3. 将文件file.txt中以"apple"开头的行的上一行插入"banana",并将结果输出到屏幕。

sed 学习笔记

sed 学习笔记

sed 学习笔记 内容来自网络sed 学习笔记(与大家共勉) admirer声明:这些代码只是为了学习和理解sed命令而为之,并不代表问题的唯一解或最佳解,希望各位拍砖参考资料:等一. 替换1.神奇变换(y命令的使用) 代码:sed 'y/ori_letter_list/target_letter_list/' filename代码:cat filename1234567890234567890134567890124567890123测试将文件中1换成A将文件中2换成B...将文件中0换成J代码:sed 'y/1234567890/ABCDEFGHIJ/' filenameABCDEFGHIJBCDEFGHIJACDEFGHIJABDEFGHIJABC注意变换关系是按两个list的位置对应变换,y是一个管局命令,拒绝使用后缀flag/glist1:1234567890list2:ABCDEFGHIJ下面再作一个与前例相反的变换代码:sed 'y/0987654321/ABCDEFGHIJ/' filenameJIHGFEDCBAIHGFEDCBAJHGFEDCBAJIGFEDCBAJIH2.替换每行第一个匹配代码:sed 's/regexpr/anyword/' filenamesed 's/regexpr/anyword/1' filename举例:引用:cat filename1234567890 23456789013456789012 4567890123sed 's/5/五/' filename1234五67890 234567890134五6789012 45678901233.替换每行第n(如果有的话)个匹配代码:sed "s/regexpr/anyword/$" filenamecat filename111111111111111111 222222222222222222 333333333333333333 444444444444444444举例sed "s/4/ 四 /8" filename 111111111111111111 222222222222222222 3333333333333333334444444 四 44444444444.替换每行所有匹配代码:cat filename1234567890 23456789013456789012 4567890123代码:举例:sed 's/3/三/g' filename12三4567890 2三45678901三456789012 456789012三二.行号处理1.为文件加行号代码:sed = filename|sed 'N;s/\n/:/'cat filename111111111111111111 222222222222222222 333333333333333333 444444444444444444举例代码:sed = filename|sed 'N;s/\n/:/' filename 1:1111111111111111112:2222222222222222223:3333333333333333334:4444444444444444442.仅为文件中的正文行加行号代码:sed /./= a|sed '/./N;s/\n/:/'举例代码:cat filename111111111111111111 222222222222222222 333333333333333333444444444444444444sed /./= a|sed '/./N;s/\n/:/' filename1:1111111111111111113:2222222222222222224:3333333333333333336:444444444444444444三.字串翻转代码:sed '/\n/!G;s/\(.\)\(.*\n\)/&/;//D;s/.//'举例代码:echo 1234567890|sed '/\n/!G;s/\(.\)\(.*\n\)/&/;//D;s/.//' 0987654321四.选择性输出1.打印文档奇数行(隔行输出)代码:sed 'n;d'sed 'x;$!N;x'sed -n 'p;n'13572.打印偶数行(隔行输出)代码:sed -n 'n;p'sed '1d;n;d;'24683.删除连续重复行(大量使用了pattern space 文件太大时要注意)代码:sed '$!N; /^\(.*\)\n$/!P; D'#使用 $!N 要当心内存溢出举例代码:cat file111111111111111111222222222222222222222222222222222222333333333333333333444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444sed '$!N; /^\(.*\)\n$/!P; D' filename 1111111111111111112222222222222222223333333333333333334444444444444444444.合并上下行并以空格相分隔代码:sed '$!N;s/\n/ /'举例代码:cat file12345678900987654321执行命令后1234567890 09876543215.将以\符号结尾的行与下行合并并以空格分隔(拼接断行) 代码:sed -e :a -e '/\$/N; s/\\n/ /; ta'举例代码:cat filename1 111111111111111111\2 2222222222222222223 333333333333333333\4 444444444444444444sed -e :a -e '/\$/N; s/\\n/ /; ta' filename1 1111111111111111112 2222222222222222223 3333333333333333334 4444444444444444446.按关键字拼接行如果某行以=开始,则合并到上一行并替代=为空格代码:sed -e :a -e '$!N;s/\n=/ /;ta' -e 'P;D'举例代码:cat file111111111111111111222222222222222222=333333333333333333444444444444444444sed -e :a -e '$!N;s/\n=/ /;ta' -e 'P;D' filename 111111111111111111222222222222222222 333333333333333333 4444444444444444447.输出匹配行的下一行代码:sed -n '/regexpr/' filename举例代码:cat filename1 1111111111111111112 2222222222222222223 3333333333333333334 444444444444444444sed -n '/^3/' filename4 4444444444444444448.显示匹配行的行号并输出匹配行的上行、匹配行、下行sed -n -e '/regexpr/' -e h举例代码:cat filename1 1111111111111111112 2222222222222222223 3333333333333333334 444444444444444444sed -n -e '/^3/' -e h filename3 #匹配行的行号2 222222222222222222 #上一行3 333333333333333333 #匹配行4 444444444444444444 #下一行9.删除文档中某标志区域内的关键字匹配行删除文档中从being开到end结束的块中包含myword的行代码:sed '/^begin/,/^end/' filename引用:cat filenamemywordbeginmywordNumber!mywordNumber!mywordNumber!mywordNumber!endmywordNumber!测试引用:mywordbeginNumber!Number!Number!Number!endmywordNumber!五.字串解析1.从字串中解析出两个子串(前2各字符和后9个字符)代码:echo "WeLoveChinaUnix"|sed -e 'H;s/\(..\).*//;x;s/.*\(.\\)$//;x;G;s/\n/ /'We ChinaUnix2.分解日期串代码:echo 20030922|sed 's/\(....\)\(..\)\(..\)/ /'|read year month dayecho $year $month $day2003 09 22binary 写到:好文!希望斑竹进一步解释一下 label 以及相关的 t 和 b 的用法先说说b吧:比如有文件如下:代码:cat filenamea123456789012345678901234567890a1234567890123456a7890先要求将其中的"5"替换成" 伍十万 ",但当该行包含字母"a"时,"5"就要替换成" 叁佰万 ". 现看如何通过b来实现:引用:cat filename.sed#!/bin/sed -f/a/b 5t #如果当前行包含字母"a"则转到label"5t"处s/5/ 五十万 /g #将5替换成" 五十万 "b #未指明跳转位置时,跳到Script的尾部:5t #设置名称为"5t"的labels/5/ 叁佰万 /g #提换5为" 叁佰万 "测试:引用:sed -f filename.sed filename1234 五十万 67890a1234 叁佰万 678901234 五十万 678901234 叁佰万 67890a1234 五十万 678901234 叁佰万 6a7890当然,这只是为了说明sed中b的用法,不带表此类问题的最佳解决途径.。

sed简明教程

sed简明教程

sed简明教程(转) 2013-03-30 15:51:19分类:LINUXsed全名叫stream editor,流编辑器,用程序的方式来编辑文本,相当的hacker啊。

sed基本上就是玩正则模式匹配,所以,玩sed的人,正则表达式一般都比较强。

同样,本篇文章不会说sed的全部东西,你可以参看sed的手册,我这里主要还是想和大家竞争一下那些从手机指缝间或马桶里流走的时间,用这些时间来学习一些东西。

当然,接下来的还是要靠大家自己双手。

用s命令替换我使用下面的这段文本做演示:$ cat pets.txtThis is my catmy cat's name is bettyThis is my dogmy dog's name is frankThis is my fishmy fish's name is georgeThis is my goatmy goat's name is adam把其中的my字符串替换成Hao Chen’s,下面的语句应该很好理解(s表示替换命令,/my/表示匹配my,/Hao Chen’s/表示把匹配替换成Hao Chen’s,/g 表示一行上的替换所有的匹配):$ sed "s/my/HaoChen's/g" pets.txtThis is Hao Chen's catHao Chen's cat's name isbettyThis is Hao Chen's dogHao Chen's dog's name isfrankThis is Hao Chen's fishHao Chen's fish's name isgeorgeThis is Hao Chen's goatHao Chen's goat's name isadam注意:如果你要使用单引号,那么你没办法通过\’这样来转义,就有双引号就可以了,在双引号内可以用\”来转义。

Linux sed 命令常用操作详解

Linux sed 命令常用操作详解sed是Linux系统中一个很好的文件处理工具,可以对数据进行替换、删除、新增以及选取等操作,使用起来也十分方面,以下是全面的sed操作介绍。

sed命令行格式:sed [options] 'command' file(s)options常用选项:-n或--quiet或——silent:仅显示script处理后的结果;-e<script>或--expression=<script>:以选项中的指定的script来处理输入的文本文件; -f<script文件>或--file=<script文件>:以选项中指定的script文件来处理输入的文本文件;-r∶sed 的动作支援的是延伸型正规表示法的语法;-i∶直接修改读取的档案内容,而不是由萤幕输出;-h或--help:显示帮助;-V或--version:显示版本信息。

Command常用命令:a:新增,a 的后面可以接字符串,而这些字符串会在新的一行出现(目前的下一行);c:取代,c 的后面可以接字符串,这些字符串可以取代 n1,n2 之间的行;d:删除,d 后面通常不接任何字符串;i:插入,i 的后面可以接字符串,而这些字符串会在新的一行出现(目前的上一行);p:列印,亦即将某个选择的资料印出。

通常 p 会与参数 sed -n 一起运作;s:取代,可以直接进行取代的工作,通常与正规表达式搭配使用。

实例说明:新增操作:a命令sed '/^bird/a\test' file将test追加到以bird开头的行后面删除操作:d命令sed '/^$/d' file #删除空白行;sed '2d' file #删除第二行;sed '2,$d' file #删除第2行到最后一行;sed '$d' file #删除最后一行;sed '/^bird/'d file #删除所有开头是bird的行;插入操作:i命令sed -i '3i\bird ' bird.conf #在bird.conf文件第3行之前插入bird 替换文本中的字符串:s命令sed 's/bird/birds/' file #将文本中的bird替换成birds;sed -i 's/ bird / birds /g' file #将file文件中每一行的第一个bird 替换为birds;以上是对Linux sed命令的简单语法介绍和应用讲解,更多的用法还需要在工作中不断的发现和使用!。

Linux Sed 命令基础使用教程

1.简介Sed是Linux系统中的一个强大的文本处理工具,它作为流编辑器(stream editor)工作,可以在不直接打开文件的情况下,对文本数据执行各种修改、搜索、替换等操作。

通过一系列精心设计的命令,Sed能够高效地自动处理大量文本文件。

2.Sed命令选项1-h:显示帮助信息;2-V:显示版本信息;3-e:允许在命令行直接指定多个编辑指令,这是默认选项;4-f filename:从文件filename中读取Sed命令;5-i:直接修改原文件内容,而不是输出到标准输出;6-n:抑制默认的输出行为,仅打印由p命令明确指定的行;3.Sed命令参数1d【删除】删除匹配的行;2s【替换】替换匹配成功的内容;3c【修改】修改匹配成功的内容;4a【添加】在匹配成功的行下面插入内容;5i【添加】在匹配成功的行上面插入内容;6p【打印】打印匹配成功的内容;4.Sed应用实例1.替换内容替换单个1匹配第一个127.0.0.1内容并替换为127.0.0.2第一种方式sed-i's/127.0.0.1/127.0.0.2/'test.sh第二种方式sed-i's?127.0.0.1?127.0.0.3?'test.sh替换所有1末尾加g表示替换所有匹配成功的内容,否则只替换第一个匹配成功。

sed-i's/127.0.0.1/127.0.0.2/g'test.sh按行替换1替换第一行sed'1s/127.0.0.2/127.0.0.1/'test.sh2替换第一行到第二行sed'1,2s/127.0.0.2/127.0.0.1/g'test.sh2.追加内容1在第二行后面追加hello内容sed-i'2a\hello'test.sh2在每一行后面都追加hell内容sed-i'a\hello'test.sh3在最后一行追加hello内容sed-i'$a\hello'test.sh4在第二行前面追加hello内容sed-i'2i\hello'test.sh5在每一行前面都追加hell内容sed-i'i\hello'test.sh3.删除内容1删除第一行sed-i'1d'test.sh2删除2到4行sed-i'2,4d'test.sh3删除第一行sed-i'^d'test.txt4删除最后一行sed-i'$d'test.txt5删除所有空行sed-i'/^$/d'test.txt4.打印内容1打印所有匹配行sed-n'/127.0.0.1/p'test.sh2打印所有匹配的内容和行号sed-n'/127.0.0.1/p;='test.sh5.总结以上示例覆盖了Sed命令的基本用法,包括替换、追加、插入、删除和打印等操作,能够帮助用户高效地处理文本文件。

sed命令

sed命令sed 是一种在线编辑器,它一次处理一行内容。

处理时,把当前处理的行(1)存储在临时缓冲区中,称为“模式空间”(pattern space),接着用(2)sed命令处理缓冲区中的内容,处理完成后,(3)把缓冲区的内容送往屏幕。

接着处理下一行,这样不断重复,直到文件末尾。

文件内容并没有改变,除非你使用重定向存储输出。

Sed主要用来自动编辑一个或多个文件;简化对文件的反复操作;编写转换程序等。

命令:[root@www ~]# sed [-nefr] [动作]选项与参数:-n :使用安静(silent)模式。

在一般sed 的用法中,所有来自STDIN 的数据一般都会被列出到终端上。

但如果加上 -n 参数后,则只有经过sed 特殊处理的那一行(或者动作)才会被列出来。

-e :直接在命令列模式上进行 sed 的动作编辑;-f :直接将 sed 的动作写在一个文件内, -f filename 则可以运行 filename 内的 sed 动作;-r :sed 的动作支持的是延伸型正规表示法的语法。

(默认是基础正规表示法语法)-i :直接修改读取的文件内容,而不是输出到终端。

动作说明: [n1[,n2]]functionn1, n2 :不见得会存在,一般代表『选择进行动作的行数』,举例来说,如果我的动作是需要在10 到20 行之间进行的,则『 10,20[动作行为] 』function:a :新增,a 的后面可以接字串,而这些字串会在新的一行出现(目前的下一行)~c :取代,c 的后面可以接字串,这些字串可以取代 n1,n2 之间的行!d :删除,因为是删除啊,所以 d 后面通常不接任何咚咚;i :插入, i 的后面可以接字串,而这些字串会在新的一行出现(目前的上一行);p :列印,亦即将某个选择的数据印出。

通常 p 会与参数 sed -n 一起运行~s :取代,可以直接进行取代的工作哩!通常这个 s 的动作可以搭配正规表示法!例如 1,20s/old/new/g 就是啦!。

sed初学者实用说明

sed初学者实⽤说明例如,在多个系统、应⽤程序安装之后,我们往往需要对很多配置⽂件进⾏修改,⽤vi编辑器意味着耗费时间、重复劳动,⽽sed就可将我们从繁重的重复劳动中解放出来。

1、sed [sed选项] 'sed命令' 要修改的⽂件2、sed [sed选项] -f sed脚本要修改的⽂件3、sed脚本 [sed选项] 要修改的⽂件这⾥仅介绍最常⽤的第⼀种⽅式-i:直接修改源⽂件(不⽤这个选项的话⽆法直接修改,必须重定向到新⽂件,如果仅作为输出测试则不需此选项),还可将源⽂件修改前备份sed -i.bak 's/123/234/' test.txt 将test.txt备份为test.txt.bak,然后将⽂件内⾏第⼀个出现的“123”替换为“234”-e:多次编辑,例如先将所有的123替换为234,再将第7⾏前加#号注释sed -i -e 's/123/234/g' -i -e '7 s/^/#/' test.txt-f:指定sed脚本⽂件名-n:取消默认的输出(不打印),⽤sed不加任何选项的话你会看到所有内容输出,并不是按照sed命令所限制的条件输出,那么配合“p”命令经可以过滤掉不符合条件的⾏,并显⽰出符合条件的⾏,例如sed -n '查找所有包含字符123的⾏'p test.txt 或 sed -n '查找所有包含字符123的⾏p' test.txtsed命令:这⾥可以使⽤正则表达式,如遇特殊字符,需⽤“\”来屏蔽其特殊含义,例如“\$”表⽰普通的字符$x x为某⾏⾏号x,y 例如2,5,从第2⾏到第5⾏/val/ 查询包含“val”字符的⾏/val1/val2/ 查询包含两个模式的⾏val/,x 在给定⾏号的⾏上查询包含“val”的⾏x,/val/ 通过⾏号和模式查询匹配的⾏x,y! 不包含指定⾏号x,y的⾏p 打印匹配的⾏= 显⽰⾏号a\ 在定位了的⾏之后附加内容i\ 在定位了的⾏之后插⼊内容d 删除定位的⾏,例如:2d 代表删除第2⾏c\ ⽤新⽂本替换定位⾏的⽂本s 替换,形式为:'s/查找的内容/替换的内容/'g 进⾏全局替换,如不使⽤此选项将只对该⾏匹配到的第⼀个结果进⾏替换,该⾏下⼀个匹配的就不处理了。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

如果可以使编辑文件的过程自动化,以便用“批处理”方式编辑文件,甚至编写可以对现有文件进行复杂更改的脚本,那将太好了。

幸运的是,对于这种情况,有一种更好的方法 -- 这种更好的方法称为 "sed"。

sed 是一种几乎包括在所有 UNIX 平台(包括 Linux)的轻量级流编辑器。

sed 有许多很好的特性。

首先,它相当小巧,通常要比您所喜爱的脚本语言小很多倍。

其次,因为 sed 是一种流编辑器,所以,它可以对从如管道这样的标准输入接收的数据进行编辑。

因此,无需将要编辑的数据存储在磁盘上的文件中。

因为可以轻易将数据管道输出到 sed,所以,将 sed 用作强大的 shell 脚本中长而复杂的管道很容易。

试一下用您所喜爱的编辑器去那样做。

GNU sed对 Linux 用户来说幸运的是,最好的 sed 版本之一恰好是 GNU sed,其当前版本是 3.02。

每一个 Linux 发行版都有(或至少应该有)GNU sed。

GNU sed 之所以流行不仅因为可以自由分发其源代码,还因为它恰巧有许多对 POSIX sed 标准便利、省时的扩展。

另外,GNU 没有 sed 早期专门版本的很多限制,如行长度限制 -- GNU 可以轻松处理任意长度的行。

最新的 GNU sed在研究这篇文章之时我注意到:几个在线 sed 爱好者提到 GNU sed 3.02a。

奇怪的是,在 上找不到 sed 3.02a,所以,我只得在别处寻找。

我在 的 /pub/sed 中找到了它。

于是我高兴地将其下载、编译然后安装,而几分钟后我发现最新的 sed 版本却是 3.02.80 -- 可在上 3.02a 源代码旁边找到其源代码。

安装完 GNU sed 3.02.80 之后,我就完全准备好了。

是新的和实验性 GNU 源代码的网站。

然而,您还会在那里发现许多优秀、稳定的源代码。

出于某种原因,不是许多 GNU 开发人员忘记将稳定的源代码移至 ,就是它们的 "beta" 期间格外长(2 年!)。

例如,sed 3.02a 已有两年,甚至 3.02.80 也有一年,但它们仍不能(在 2000 年 8 月写本文章时)在 上获得。

正确的 sed在本系列中,将使用 GNU sed 3.02.80。

在即将出现的本系列后续部分中,某些(但非常少)最高级的示例将不能在 GNU sed 3.02 或 3.02a 中使用。

如果您使用的不是 GNU sed,那么结果可能会不同。

现在为什么不花些时间安装 GNU sed 3.02.80 呢?那样,不仅可以为本系列的余下部分作好准备,而且还可以使用可能是目前最好的 sed。

sed 示例sed 通过对输入数据执行任意数量用户指定的编辑操作(“命令”)来工作。

sed 是基于行的,因此按顺序对每一行执行命令。

然后,sed 将其结果写入标准输出(stdout),它不修改任何输入文件。

让我们看一些示例。

头几个会有些奇怪,因为我要用它们演示 sed 如何工作,而不是执行任何有用的任务。

然而,如果您是 sed 新手,那么理解它们是十分重要的。

下面是第一个示例:1.$ sed -e 'd' /etc/services复制代码如果输入该命令,将得不到任何输出。

那么,发生了什么?在该例中,用一个编辑命令 'd' 调用 sed。

sed 打开 /etc/services 文件,将一行读入其模式缓冲区,执行编辑命令(“删除行”),然后打印模式缓冲区(缓冲区已为空)。

然后,它对后面的每一行重复这些步骤。

这不会产生输出,因为 "d" 命令除去了模式缓冲区中的每一行!在该例中,还有几件事要注意。

首先,根本没有修改 /etc/services。

这还是因为 sed 只读取在命令行指定的文件,将其用作输入 -- 它不试图修改该文件。

第二件要注意的事是 sed 是面向行的。

'd' 命令不是简单地告诉 sed 一下子删除所有输入数据。

相反,sed 逐行将 /etc/services 的每一行读入其称为模式缓冲区的内部缓冲区。

一旦将一行读入模式缓冲区,它就执行 'd' 命令,然后打印模式缓冲区的内容(在本例中没有内容)。

我将在后面为您演示如何使用地址范围来控制将命令应用到哪些行 -- 但是,如果不使用地址,命令将应用到所有行。

第三件要注意的事是括起 'd' 命令的单引号的用法。

养成使用单引号来括起sed 命令的习惯是个好注意,这样可以禁用 shell 扩展。

另一个 sed 示例下面是使用 sed 从输出流除去 /etc/services 文件第一行的示例:1.$ sed -e '1d' /etc/services | more复制代码如您所见,除了前面有 '1' 之外,该命令与第一个 'd' 命令十分类似。

如果您猜到 '1' 指的是第一行,那您就猜对了。

与第一个示例中只使用 'd' 不同的是,这一次使用的 'd' 前面有一个可选的数字地址。

通过使用地址,可以告诉sed 只对某一或某些特定行进行编辑。

地址范围现在,让我们看一下如何指定地址范围。

在本例中,sed 将删除输出的第 1 到10 行:1.$ sed -e '1,10d' /etc/services | more复制代码当用逗号将两个地址分开时,sed 将把后面的命令应用到从第一个地址开始、到第二个地址结束的范围。

在本例中,将 'd' 命令应用到第 1 到 10 行(包括这两行)。

所有其它行都被忽略。

带规则表达式的地址现在演示一个更有用的示例。

假设要查看 /etc/services 文件的内容,但是对查看其中包括的注释部分不感兴趣。

如您所知,可以通过以 '#' 字符开头的行在 /etc/services 文件中放置注释。

为了避免注释,我们希望 sed 删除以 '#' 开始的行。

以下是具体做法:1.$ sed -e '/^#/d' /etc/services | more复制代码试一下该例,看看发生了什么。

您将注意到,sed 成功完成了预期任务。

现在,让我们分析发生的情况。

要理解 '/^#/d' 命令,首先需要对其剖析。

首先,让我们除去 'd' -- 这是我们前面所使用的同一个删除行命令。

新增加的是 '/^#/' 部分,它是一种新的规则表达式地址。

规则表达式地址总是由斜杠括起。

它们指定一种模式,紧跟在规则表达式地址之后的命令将仅适用于正好与该特定模式匹配的行。

因此,'/^#/' 是一个规则表达式。

但是,它做些什么呢?很明显,现在该复习规则表达式了。

规则表达式复习可以使用规则表达式来表示可能会在文本中发现的模式。

您在 shell 命令行中用过 '*' 字符吗?这种用法与规则表达式类似,但并不相同。

下面是可以在规则表达式中使用的特殊字符:字符描述^ 与行首匹配$ 与行末尾匹配\w 与任一个字符匹配* 将与前一个字符的零或多个出现匹配[ ] 与 [ ] 之内的所有字符匹配感受规则表达式的最好方法可能是看几个示例。

所有这些示例都将被 sed 作为合法地址接受,这些地址出现在命令的左边。

下面是几个示例:规则表达式描述/./ 将与包含至少一个字符的任何行匹配/../ 将与包含至少两个字符的任何行匹配/^#/ 将与以 '#' 开始的任何行匹配/^$/ 将与所有空行匹配/}^/ 将与以 '}'(无空格)结束的任何行匹配/} *^/ 将与以 '}' 后面跟有零或多个空格结束的任何行匹配/[abc]/ 将与包含小写 'a'、'b' 或 'c' 的任何行匹配/^[abc]/ 将与以 'a'、'b' 或 'c' 开始的任何行匹配在这些示例中,鼓励您尝试几个。

花一些时间熟悉规则表达式,然后尝试几个自己创建的规则表达式。

可以如下使用 regexp:1.$ sed -e '/regexp/d' /path/to/my/test/file | more复制代码这将导致 sed 删除任何匹配的行。

然而,通过告诉 sed 打印regexp 匹配并删除不匹配的内容,而不是与之相反的方法,会更有利于熟悉规则表达式。

可以用以下命令这样做:1.$ sed -n -e '/regexp/p' /path/to/my/test/file | more复制代码请注意新的 '-n' 选项,该选项告诉 sed 除非明确要求打印模式空间,否则不这样做。

您还会注意到,我们用 'p' 命令替换了 'd' 命令,如您所猜想的那样,这明确要求 sed 打印模式空间。

就这样,将只打印匹配部分。

有关地址的更多内容目前为止,我们已经看到了行地址、行范围地址和 regexp 地址。

但是,还有更多的可能。

我们可以指定两个用逗号分开的规则表达式,sed 将与所有从匹配第一个规则表达式的第一行开始,到匹配第二个规则表达式的行结束(包括该行)的所有行匹配。

例如,以下命令将打印从包含 "BEGIN" 的行开始,并且以包含"END" 的行结束的文本块:1.$ sed -n -e '/BEGIN/,/END/p' /my/test/file | more复制代码如果没发现 "BEGIN",那么将不打印数据。

如果发现了 "BEGIN",但是在这之后的所有行中都没发现 "END",那么将打印所有后续行。

发生这种情况是因为 sed 面向流的特性 -- 它不知道是否会出现 "END"。

C 源代码示例如果只要打印 C 源文件中的 main() 函数,可输入:1.$ sed -n -e '/main[[:space:]]*(/,/^}/p' sourcefile.c | more复制代码该命令有两个规则表达式 '/main[[:space:]]*(/' 和 '/^}/',以及一个命令'p'。

第一个规则表达式将与后面依次跟有任意数量的空格或制表键以及开始圆括号的字符串 "main" 匹配。

相关文档
最新文档