sed用法介绍

本文介绍了sed编辑器的基础用法,包括如何使用sed命令编辑文本、替换字符串、删除文本等内容,并提供了多个实例帮助读者掌握sed的基本操作。
sed用法介绍
sed是一个非交互性文本流编辑器.它编辑文件或标准输入导出的文本拷贝.标准输入可能是来自键盘、文件重定向、字符串或变量,或者是一个管道的文本.sed可以做些什么呢?别忘了, Vi也是一个文本编辑器。sed可以随意编辑小或大的文件,有许多sed命令用来编辑、删除,并允许做这项工作时不在现场. s e d一次性处理所有改变,因而变得很有效,对用户来讲,最重要的是节省了时间。
    本章内容有:
    • 抽取域。
    • 匹配正则表达式。
    • 比较域。
    • 增加、附加、替换。
    • 基本的sed命令和一行脚本。
    可以在命令行输入sed命令,也可以在一个文件中写入命令,然后调用sed,这与a w k基本相同。使用 s e d需要记住的一个重要事实是,无论命令是什么,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脚本文件,其格式为:

不管是使用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!

sed编辑命令

如下:                 
                 p                     打印匹配行

                 =                     显示文件行号
                 
                 a\                    在定位行号后附加新文本信息
                 
                 i\                    在定位行号后插入新文本信息
                 
                 d                     删除定位行
                 
                 c\                    用新文本替换定位文本

                 s                     使用替换模式替换相应模式
             
                 r                     从另一个文件中读文本
             
                 w                     写文本到一个文件
             
                 q                     第一个模式匹配完成后推出或立即推出
             
                 l                     显示与八进制 ASCII代码等价的控制字符
             
                 {}                    在定位行执行的命令组
             
                 n                     从另一个文件中读文本下一行,并附加在下一行
             
                 g                     将模式2粘贴到/pattern n/
             
                 y                     传送字符
             
                 n                     延续到下一输入行;允许跨行的模式匹配语句

notice:刚开始看的时候并不需要全记下来。再接下来的操作中跟着例子一步步熟悉吧

基本sed编程举例一

如果不特别声明, sed例子中使用下述文本文件 quote.txt。
$cat quote.txt
The honeysuckle band played all night long for only $90.
It was an evening of splendid music and company.
Too bad the disco floor fell through at 23:10.
The local nurse Miss P.Neave was in attendance.


10.3 sed和正则表达式
    s e d识别任何基本正则表达式和模式及其行匹配规则。记住规则之一是:如果要定位一特
殊字符,必须使用( \)屏蔽其特殊含义,如有必要请参照第 7章正则表达式。第 7章使用的所
有正则表达式在 sed中都是合法的


10.4 基本sed编程举例
    下面通过例子实际检验一下 sed的编辑功能。
10.4.1 使用p(rint)显示行
    print命令格式为 [address[,address]P。显示文本行必须提供sed命令行号。
$sed '2p' quote.txt
The honeysuckle band played all night long for only $90.
It was an evening of splendid music and company.
It was an evening of splendid music and company.
Too bad the disco floor fell through at 23:10.
The local nurse Miss P.Neave was in attendance.
    错误在哪儿?原意只打印第二行,但是却打印了文件中所有行,为此需使用-n选项,显
示打印定位(匹配行。
$sed -n '2p' quote.txt
It was an evening of splendid music and company.

10.4.2 打印范围
    可以指定行的范围,现打印 1到3行,用逗号分隔行号。
$sed -n '1,3p' quote.txt
The honeysuckle band played all night long for only $90.
It was an evening of splendid music and company.
Too bad the disco floor fell through at 23:10.

10.4.3 打印模式
    假定要匹配单词 Neave,并打印此行,方法如下。使用模式 /pattern/格式,这里为/Neave/。
$sed -n '/Neave/p' quote.txt
The local nurse Miss P.Neave was in attendance.

10.4.4 使用模式和行号进行查询
    为编辑某个单词浏览一个文件时, s e d返回包含指定单词的许多行。怎样使返回结果更精
确以满足模式匹配呢?可以将行号和模式结合使用。下面这个例子,假定要改动文件 quote.txt
最后一行中的单词The,使用sed查询The,返回两行:
$sed -n '/The/p' quote.txt
The honeysuckle band played all night long for only $90.
The local nurse Miss P.Neave was in attendance.
    使用模式与行号的混合方式可以剔除第一行,格式为line_number,/pattern/。逗号用来分隔行号与模式开始部分。为达到预期结果,使用4,/The/。意即只在第四行查询模式The,命令如下:
$sed -n '4,/The/p' quote.txt
The local nurse Miss P.Neave was in attendance.


10.4.5 匹配元字符
    匹配元字符 $前,必须使用反斜线 \屏蔽其特殊含义。模式为 /\$/p 。
$sed -n '/\$/p' quote.txt
The honeysuckle band played all night long for only $90.


10.4.6 显示整个文件
    要打印整个文件,只需将行范围设为第一行到最后一行 1,$。$意为最后一行。
$sed -n '1,$p' quote.txt
The honeysuckle band played all night long for only $90.
It was an evening of splendid music and company.
Too bad the disco floor fell through at 23:10.
The local nurse Miss P.Neave was in attendance.
也可以用$sed -n 'p' quote.txt来打印整个文件

10.4.7 任意字符
    匹配任意字母,后跟任意字母的0次或多次重复,并以ing结尾,模式为/.*ing/。可以使用这个模式查询以 ing结尾的任意单词。
$sed -n '/.*ing/p' quote.txt
It was an evening of splendid music and company.


10.4.8 首行
    要打印文件第一行,使用行号:
$sed -n '1p' quote.txt
The honeysuckle band played all night long for only $90.


10.4.9 最后一行
    要打印最后一行,使用 $。$是代表最后一行的元字符。
$sed -n '$p' quote.txt
The local nurse Miss P.Neave was in attendance.



10.4.10 打印行号
    要打印行号,使用等号 =。打印模式匹配的行号,使用格式 /pattern/=。
$sed -e '/music/=' quote.txt
The honeysuckle band played all night long for only $90.
2
It was an evening of splendid music and company.
Too bad the disco floor fell through at 23:10.
The local nurse Miss P.Neave was in attendance.
    整个文件都打印出来,并且匹配行打印了行号。如果只关心实际行号,使用 -n选项。
$sed -n '/music=/' quote.txt
2
    如果只打印行号及匹配行,必须使用两个sed命令,并使用-e选项。第一个命令打印模式
匹配行,第二个使用=选项打印行号,格式为sed -n -e /pattern/p -e /pattern/=。
$sed -n -e '/music/p' -e '/music/=' quote.txt
It was an evening of splendid music and company.
2

基本sed编程举例二

10.4.11 附加文本
    要附加文本,使用符号a\,可以将指定文本一行或多行附加到指定行。如果不指定文本放
置位置,sed缺省放在每一行后面。附加文本时不能指定范围,只允许一个地址模式。文本附
加操作时,结果输出在标准输出上。注意它不能被编辑,因为sed执行时,首先将文件的一行
文本拷贝至缓冲区,在这里sed编辑命令执行所有操作(不是在初始文件上)                   ,因为文本直接输出到标准输出,sed并无拷贝。
    要想在附加操作后编辑文本,必须保存文件,然后运行另一个 s e d命令编辑它。这时文件的内容又被移至缓冲区。
    附加操作格式如下:
[address]a\
text\
text\
...
text
    地址指定一个模式或行号,定位新文本附加位置。a\ 通知sed对a\后的文本进行实际附加
操作。观察格式,注意每一行后面有一斜划线,这个斜划线代表换行。 s e d执行到这儿,将创
建一新行,然后插入下一文本行。最后一行不加斜划线, sed假定这是附加命令结尾。
    当附加或插入文本或键入几个 s e d命令时,可以利用辅助的shell提示符以输入多行命令。
这里没有这样做,因为可以留给使用者自己编写,并且在一个脚本文件中写这样的语句更适宜。现在马上讲述 sed脚本文件。另外,脚本可以加入空行和注释行以增加可读性。

10.4.12 创建sed脚本文件
    要创建脚本文件 append.sed,输入下列命令:
$cat >./append.sed<<EOF
> #!/bin/sed -f
> /company/ a\
> Then suddenly it happened.\
> Then suddenly.
> EOF
    当然你也可以用vi来编辑这个文件
    保存它,增加可执行权限:
$chmod u+x ./append.sed
    运行,
$./append.sed quote.txt
The honeysuckle band played all night long for only $90.
It was an evening of splendid music and company.
Then suddenly it happened.
Just suddenly.
Too bad the disco floor fell through at 23:10.
The local nurse Miss P.Neave was in attendance.



10.4.13 插入文本
    插入命令类似于附加命令,只是在指定行前面插入。和附加命令一样,它也只接受一个
地址。下面是插入命令的一般格式。地址是匹配模式或行号:
    下面例子在以attendance结尾的行前插入文本 utter confusion followed。
#!/bin/sed -f
/attendance/ i\
utter confusion followed
    运行结果是:
The honeysuckle band played all night long for only $90.
It was an evening of splendid music and company.
Too bad the disco floor fell through at 23:10.
utter confusion followed
The local nurse Miss P.Neave was in attendance.
     也可以使用行号指定文本插入位置,插入位置在模式或指定行号4之前。脚本如下:
#!/bin/sed -f 
4 i\
utter confusion followed.


10.4.14 修改文本
    修改命令将在匹配模式空间的指定行用新文本加以替代,格式如下:
[address[,address] c\
text\
text\
...
text
    将第一行The honeysuckle band played all night long for only $90.替换为The office Dibble band played well.首先要匹配第一行的任何部分,可使用模式/honeysuckle/’. sed脚本文件为change.sed。内容如下:
#!/bin/sed -f
#change.sed
/honeysuckle/ c\
The Office Dibble band played well.
    运行它,不要忘了给脚本增加可执行权限。 chmod u+x change.sed。结果如下 :
The Office Dibble band played well.
It was an evening of splendid music and company.
Too bad the disco floor fell through at 23:10.
The local nurse Miss P.Neave was in attendance.
    像插入动作一样,可以使用行号代替模式,两种方式完成相同的功能。
#!/bin/sed -f
1 c\
The Office Dibble band played well.

    可以对同一个脚本中的相同文件进行修改、附加、插入三种动作匹配和混合操作。
    下面是一个带有注释的脚本例子。
#!/bin/sed -f
#mix.sed
#This is the change on line 1
1 c\
The Dibble hand were grooving
#Let's now insert one line
/evening/ i\
They played some great tunes.
#Change the last line ,a $ means last line
$ c\
Nurse Neave was too tipsy to help
#Stick in a new line before the last line.
3 a\Where was the nurse to help
运行结果如下:
The Dibble hand were grooving
They played some great tunes.
It was an evening of splendid music and company.
Too bad the disco floor fell through at 23:10.
Where was the nurse to help
Nurse Neave was too tipsy to help

10.4.15 删除文本
sed删除文本格式:
[address[,address]]d
地址可以是行的范围或模式,让我们看几个例子。
删除第一行;1d意为删除第一行。
$sed '1d' quote.txt
删除第一到第三行:
$sed '1,3d' quote.txt
删除最后一行:
$sed '$d' quote.txt
也可以使用正则表达式进行删除操作。下面的例子删除包含文本Neave的行。
$sed '/Neave/d' quote.txt


10.4.16 替换文本
替换命令用替换模式替换指定模式,格式为:
[address[,address]]s/pattern-to-find/replacement-pattern/[gpwn]
s选项通知sed这是一个替换操作,并查询pattern-to-find,成功后用replacement-pattern替换它。
替换选项如下:
g: 缺省情况下只替换第一次出现模式,使用 g选项替换全局所有出现模式。
p:缺省sed将所有被替换行写入标准输出,加p选项将使-n选项无效.-n选项不打印输出p结果。
w 文件名: 使用此选项将输出定向到一个文件。
让我们看几个例子.替换night为NIGHT,首先查询模式night,然后用文本NIGHT替换它。
$sed 's/night/NIGHT/' quote.txt
The honeysuckle band played all NIGHT long for only $90.
It was an evening of splendid music and company.
Too bad the disco floor fell through at 23:10.
The local nurse Miss P.Neave was in attendance.
要从$90中删除$符号(记住这是一个特殊符号,必须用\屏蔽其特殊含义)在replacement-pattern部分不写任何东西,保留空白,但仍需要用斜线括起来.在sed中也可以这样删除一个字符串。
$sed 's/\$//' quote.txt
The honeysuckle band played all night long for only 90.
It was an evening of splendid music and company.
Too bad the disco floor fell through at 23:10.
The local nurse Miss P.Neave was in attendance.
要进行全局替换,即替换所有出现模式,只需在命令后加g选项,下面的例子将所有The替换成Wow!。
$sed 's/The/Wow!/g' quote.txt
Wow! honeysuckle band played all night long for only $90.
It was an evening of splendid music and company.
Too bad the disco floor fell through at 23:10.
Wow! local nurse Miss P.Neave was in attendance.
将替换结果写入一个文件用w选项,下面的例子将splendid替换为SPLENDID的替换结果
写入文件sed.out:
$sed 's/splendid/SPLENDID/w sed.out' quote.txt
The honeysuckle band played all night long for only $90.
It was an evening of SPLENDID music and company.
Too bad the disco floor fell through at 23:10.
The local nurse Miss P.Neave was in attendance.
注意要将文件名括在sed的单引号里。文件结果如下:
$cat ./sed.out
It was an evening of SPLENDID music and company.

10.5 使用替换修改字符串
如果要附加或修改一个字符串,可以使用(&)命令,&命令保存发现模式以便重新调用它,然后把它放在替换字符串里面.这里给出一个修改的设计思路.先给出一个被替换模式,然后是一个准备附加在第一个模式后的另一个模式,并且后面带有&,这样修改模式将放在匹配模式之前.例如sed语句s/nurse/"Hello" &/p 的结果如下:
$sed -n 's/nurse/"Hello" &/p' quote.txt
The local "Hello" nurse Miss P.Neave was in attendance.
原句是文本行The local nurse Miss P.Neave was in attendance.
记住模式中要使用空格,因为输出结果表明应加入空格。
还有一个例子:
$sed -n 's/played/from Hockering &/p' quote.txt
The honeysuckle band from Hockering played all night long for only $90.
原句是The honeysuckle band played all night long for only $90。相信这种修改动作已经讲
解得很清楚了。


10.6 将sed结果写入文件命令
像使用>文件重定向发送输出到一个文件一样,在sed命令中也可以将结果输入文件.格式有点像使用替换命令:
[address[,address]]w filename
'w'选项通知sed将结果写入文件.filename是自解释文件名.下面有两个例子。
$sed '1,2 w filedt' quote.txt
文件quote.txt输出到屏幕.模式范围即1,2行输出到文件filedt.
cat ./filedt
The honeysuckle band played all night long for only $90.
It was an evening of splendid music and company.
下面例子中查询模式Neave,匹配结果行写入文件dht.
$sed '/Neave/w dht' quote.txt
$cat ./dht
The local nurse Miss P.Neave was in attendance.


10.7 从文件中读文本
处理文件时,sed允许从另一个文件中读文本,并将其文本附加在当前文件.此命令放在模式匹配行后.格式为:
address r filename
这里r通知sed将从另一个文件源中读文本.filename是其文件名.
   现在创建一个小文件 sedex.txt,内容如下:
$cat sedex.txt
Boom boom went the music.
将sedex.txt内容附加到文件quote.txt的拷贝.在模式匹配行/company/后放置附加文本.本例为第三行.注意所读的文件名需要用单引号括起来.
$sed '/company./r sedex.txt' quote.txt 
The honeysuckle band played all night long for only $90.
It was an evening of splendid music and company.
Boom boom went the music
Too bad the disco floor fell through at 23:10.
The local nurse Miss P.Neave was in attendance.


10.8 匹配后退出
有时需要在模式匹配首次出现后退出sed,以便执行其他处理脚本.退出命令格式为:
address q
下面的例子假定查询模式/.a.*/,意为任意字符后跟字符a,再跟任意字符0次或任意多次。
查询首次出现模式,然后退出.需要将q放在sed语句末尾。
$sed '/.a.*/q' quote.txt
The honeysuckle band played all night long for only $90.
10.10 使用系统sed
前面已经讲述了sed的基本功能,但是在脚本或命令行中使用sed真正要做的是修改或删除文件或字符串中文本.下面运用前面学过的知识讲述这一点。


10.10.1 处理控制字符
使用sed实现的一个重要功能是在另一个系统中下载的文件中剔除控制字符.
下面是传送过来的文件(dos.txt)的部分脚本.必须去除所有可疑字符,以便于帐号所有者使用文件.
cat dos.txt
12232##DISO##45.12^M
00332##LPSO##23.11^M
01299##USPD##34.46^M
    可采取以下动作:
    1) 用一个空格替换所有的(##)符号.
    2) 删除起始域中最前面的0 (00).
    3) 删除行尾控制字符(^M).

一些系统中,回车符为^@和^L,如果遇到一些怪异的字符,不必担心,只要是在行尾并且全都相同就可以。
按步执行每一项任务,以保证在进行到下一任务前得到理想结果。使用输入文件dos.txt。
    任务1。删除所有的 #字符很容易,可以使用全局替换命令。这里用一个空格替换两个或
更多的#符号。
$sed 's/##*/ /g' dos.txt
12232 DISO 45.12^M
00332 LPSO 23.11^M
01299 USPD 34.46^M
    任务2。 删除所有行首的 0。使用^符号表示模式从行首开始,^0*表示行首任意个0。模式
s/^0*//g设置替换部分为空,即为删除模式,正是要求所在。
$sed 's/^0*//g' dos.txt
12232##DISO##45.12^M
332##LPSO##23.11^M
1299##USPD##34.46^M
    任务3.最后去除行尾^M符号,为此需做全局替换.设置替换部分为空.模式为:'s/\^m//g'
$sed 's/\^M//g' dos.txt
12232##DISO##45.12
00332##LPSO##23.11
01299##USPD##34.46
     分步测试预想功能对理解整个过程很有帮助。用sed在移到下一步前测试本步功能及结果
很重要。如果不这样,可能会有一大堆包含怪异字符的意料外的结果。
将所有命令结合在一起,使用管道将cat命令结果传入一系列sed命令,sed命令与上面几步精确过滤字符的sed相同。
$sed 's/##*/ /g' dos.txt|sed 's/^00*//g'|sed 's/\^M//g'
12232 DISO 45.12
332 LPSO 23.11
1299 USPD 34.46
现在文件对帐号管理者可用.
可以将命令放在文件里,然后运行它。下面即为转换脚本。
实现上述功能的sed脚本文件:
#!/bin/sed -f
#dos.sed
s/##*/ /g
s/^00*//g
s/\^M//g

$chmod u+x ./dos.sed
$./dos.sed dos.txt
12232 DISO 45.12
332 LPSO 23.11
1299 USPD 34.46


10.10.2 处理报文输出
当从数据库中执行语句输出时,一旦有了输出结果,脚本即可做进一步处理。通常先做一些整理,下面是一个sql查询结果。
Database        Size:(MB)       Data Created
------------------------------------

GOSOUTH         2244            12//11/97
TRISUD          5632            8/9/99

(2 rows affected)
为了使用上述输出信息做进一步自动处理,需要知道所存数据库名称,为此需执行以下操作:
    1) 使用s/-*//g删除横线------。
    2) 使用/^$/d删除空行。
    3) 使用$d删除最后一行
    4) 使用1d删除第一行。
    5) 使用awk {print $1}打印第一列。
    命令如下
$sed 's/--*//g' sql.txt|sed '/^$/d'|sed '1d'|sed '$d'|awk '{print $1}'
GOSOUTH
TRISUD


10.10.3 去除行首数字
对接下来的这个文件实施的操作是去除行首所有数字,每个记录应以 U N H或U N D开头,而不是 UNH或UND前面的数字。文件如下:
$cat UNE.txt
12345UND SPLLFC 234344
9999999UND SKKLT 3423
1UND SPLLY 434
使用基本正则表达式完成这个操作。[0-9]代表行首任意数字,替换部分为空格是为了确保删除前面的匹配模式,即数字。
$sed 's/^[0-9]*//g' UNE.txt
UND SPLLFC 234344
UND SKKLT 3423
UND SPLLY 434


10.10.4 附加文本
当帐户完成设置一个文件时,帐号管理者可能要在文件中每个帐号后面加一段文字,下面是此类文件的一部分:
$cat ok.txt
AC456
AC492169
AC9967
AC88345
任务是在每一行末尾加一个字符串'passed'.
使用$命令修改各域会使工作相对容易些。首先需要匹配至少两个或更多的数字重复出现,这样将所有的帐号加进匹配模式。
$sed 's/[0-9][0-9]$/& Passed/g' ok.txt
AC456 Passed
AC492169 Passed
AC9967 Passed
AC88345 Passed
也可以用如下命令实现:
$sed 's/.*/& Passed/g' ok.txt

10.10.5 从shell向sed传值
要从命令行中向sed传值,值得注意的是用双引号,否则功能不执行.
#name="It's a go situation"
#replace="GO"
#`echo $name|sed "s/go/$replace/g"`
It's a GO situation


10.10.6 从sed输出中设置shell变量
从sed输出中设置shell变量是一个简单的替换过程.运用上面的例子,创建shell变量new-name,保存上述 sed例子的输出结果。
#name="It's a go situation"
#replace="GO"
#new_name=`echo $name|sed "s/go/$replace/g"`
#echo $new_name
It's a GO situation
10.11 快速一行命令
下面是一些一行命令集。[]表示空格, [ ]表示tab键)
-------------------------------------------------------------------------------------                             
           's/\.$//g'           删除以句点结尾行
           '-e /abcd/d'         删除包含abcd的行
           's/[][][]*/[]/g'     删除一个以上空格,用一个空格代替
           's/^[][]*//g,        删除行首空格
           's/\.[][]*/[]/g'     删除句点后跟两个或更多空格,代之以一个空格
           '/^$/d'              删除空行
           's/^.//g'            删除第一个字符
           's/COL\(...\)//g'    删除紧跟COL的后三个字母
           's/^\///g'           从路径中删除第一个 \
           's/[]/[]//g'         删除所有空格并用tab键替代
           'S/^[]//g'           删除行首所有tab键
           's/[]*//g'           删除所有tab键
-------------------------------------------------------------------------------------


下面是一些实例

   
1. 删除路径名第一个/符号
   将当前工作目录返回给 sed,删除第一个/
cd /usr/local
$pwd|sed 's/^\///g'
usr/local
   
2. 追加/插入文本
   将"Mr Willis"字串返回给 sed并在Mr后而追加"Bruce"。
$echo "Mr Willis"|sed 's/Mr/& Bruce/'
Mr Bruce Willis

3. 删除首字符
   sed删除字符串“accounts.doc”首字符。
$echo "accounts.doc"|sed 's/^.//'
ccounts.doc

4. 删除文件扩展名
   sed删除“accounts.doc”文件扩展名。
$echo "accounts.doc"|sed 's/\.doc$//'
accounts

5. 增加文件扩展名
   sed附加字符串“.doc”到字符串“accounts”
$echo "accounts"|sed 's/.$/.doc/'
accounts.doc

6. 替换字符系列
   如果变量x含有下列字符串:
$x="Department+payroll%Building G"
$echo $x
Department+payroll%Building G

   如果要实现下列转换:
   + to ' of '
   % to ' located '
   sed命令是:
$echo $x|sed 's/+/ of /g'|sed 's/\%/ located /g'
Department of payroll located Building G

<think>嗯,用户想了解sed工具的使用方法,之前系统已经提供了一些引用资料。我需要整合这些信息,给用户一个清晰实用的sed指南。 用户可能是个Linux新手管理员,或者正在写脚本需要文本处理。ta直接要"使用方法",说明需要实操指导而非理论。从引用看,sed的核心是逐行处理、模式匹配和命令操作。 首先得解释基本原理,否则用户会迷惑为什么sed命令这么写。引用[4]的工作流程描述很关键:逐行加载、内存处理、输出结果。这个必须放在开头讲清楚,避免用户误以为直接修改文件。 常用选项部分要突出"-i"和"-n"这两个最易出错的点。用户常忘记"-i"导致文件没改,或者没用"-n"却奇怪为什么多输出内容。引用[2]提到默认不修改文件这点很重要。 命令格式的说明要拆解:选项、脚本、文件三部分。引用[1]的格式模板很好,但需要补充例子说明"address+command"的组合逻辑,比如"2d"是地址2加删除命令。 命令类型按增删改查分类最直观。引用[5]的删除操作例子很全,但需要补充插入和替换的典型用法。这里特别要注意定界符转义的问题,很多人被/符号坑过。 正则表达式部分单独成节比较好,因为sed的强大正在于此。要强调元字符如^$.*[]的用法,但避免太深入以免 overwhelm 用户。 最后必须包含安全提示!很多新手直接"-i"把文件搞坏。建议先输出到临时文件,或者用"--in-place=backup"备份。这个在引用里没提,但实际工作特别重要。 测试建议也很关键。用户可能不知道可以用管道测命令,或者忘了用tail -f监控日志。这些实战技巧比手册更有价值。 相关问题设计成进阶路线:从应用场景(日志处理)到高级功能(多命令组合),最后到调试技巧。这样用户学完基础自然知道下一步学什么。 </think>好的,以下是关于 `sed` (Stream Editor) 工具使用方法的清晰总结,整合了您提供的引用信息: **sed 工具核心概念与使用方法** `sed` 是一个强大、非交互式的**流式文本编辑器**。它逐行处理输入(文件或标准输入流),根据预设的规则(脚本)进行修改(查找、替换、删除、插入等),并将结果输出(默认到标准输出)。**其核心工作原理是:** 1. **逐行读取**:`sed` 依次读取输入文件的每一行内容到内存中(称为“模式空间”)。 2. **规则匹配与应用**:对于读入的每一行,它检查是否匹配脚本中指定的地址(行号或正则表达式)和命令。如果匹配,则应用相应的命令(如替换、删除、打印等)。 3. **输出结果**:处理完当前行后(无论是否修改),`sed` 默认会将模式空间的内容输出(通常是标准输出)。 4. **非原地修改**:**默认情况下 `sed` 不会直接修改原始文件**。它只是将处理后的结果显示出来。如果需要修改原文件,必须使用 `-i`(或 `--in-place`)选项[^2][^4][^5]。 5. **脚本驱动**:所有操作指令都写在传递给 `sed` 的“脚本”(`script`)参数中。 **一、基本命令格式** ```bash sed [选项] '脚本命令' [输入文件...] ``` * **`[选项]`** (常用): * `-e 'script'` / `--expression='script'`:添加脚本命令。可以多次使用以执行多个命令。 * `-f scriptfile` / `--file=scriptfile`:从指定文件中读取脚本命令。 * `-i[SUFFIX]` / `--in-place[=SUFFIX]`:**直接修改原文件**。如果提供 `SUFFIX`,则会创建以该后缀命名的备份文件(强烈建议使用备份,例如 `-i.bak`)[^2][^5]。 * `-n` / `--quiet` / `--silent`:**抑制默认输出**。通常与 `p` (print) 命令一起使用,只输出显式要求打印的行[^2][^5]。 * `-r` / `-E` / `--regexp-extended`:使用扩展正则表达式(ERE)而非基础正则表达式(BRE)。功能更强大,推荐使用。 * **`'脚本命令'`**:核心部分,由地址(可选)+ 命令组成: * **地址 (Address)**: 指定命令作用于哪些行。省略则表示作用于所有行。 * `n`:明确的行号(如 `5` 表示第5行)。 * `$`:最后一行。 * `n,m`:行号范围(如 `2,5` 表示第2到第5行)。 * `/regex/`:匹配正则表达式 `regex` 的行(如 `/^root/` 匹配以 `root` 开头的行)。 * `n~m`:从第 `n` 行开始,每隔 `m` 行匹配一次(如 `1~2` 匹配所有奇数行)。 * 地址后加 `!` 表示取反(如 `5!d` 表示删除除了第5行以外的所有行)。 * **命令 (Command)**: 对匹配行执行的操作(常用): * `s/regex/replacement/flags`:**替换 (Substitute)**。查找匹配 `regex` 的部分,用 `replacement` 替换。 * `flags`: * `g`:全局替换(一行中所有匹配项)。 * `p`:如果替换发生,则打印该行(常与 `-n` 连用)。 * `i` 或 `I`:忽略大小写匹配。 * `w file`:将成功替换的行写入文件 `file`。 * **定界符**:通常使用 `/`,但如果 `regex` 或 `replacement` 中包含 `/`,可以用其他字符(如 `:`, `|`, `#`)转义或替代(如 `s|/old/path|/new/path|g`)[^5]。 * `d`:**删除 (Delete)** 匹配的行(这些行不会被输出)。 * `p`:**打印 (Print)** 匹配的行(常与 `-n` 连用)。 * `a \text`:**在匹配行之后追加 (Append)** 文本 `text`。 * `i \text`:**在匹配行之前插入 (Insert)** 文本 `text`。 * `c \text`:**更改/替换 (Change)** 匹配的行(整行替换)为文本 `text`。 * `r file`:**读取文件 (Read)** 的内容,并将其插入到匹配行之后。 * `w file`:**写入文件 (Write)** 将匹配的行写入到文件 `file`。 * `q [exit-code]`:**读取完退出 (Quit)** 处理完匹配行后立即退出 `sed`(可选退出码)。 * **`[输入文件...]`**:要处理的文件。可以指定多个文件。省略则从标准输入读取。 **二、常用操作示例** 假设我们有一个文件 `test.txt`。 1. **查看/选择行:** * 查看第3行:`sed -n '3p' test.txt` * 查看第2到第5行:`sed -n '2,5p' test.txt` * 查看包含 "error" 的行:`sed -n '/error/p' test.txt` * 查看空白行:`sed -n '/^$/p' test.txt` (或 `-n '/^\s*$/p'` 匹配空或仅含空白符的行) 2. **删除行:** * 删除空白行:`sed '/^$/d' test.txt` * 删除第2行:`sed '2d' test.txt` * 删除第2行到最后一行:`sed '2,$d' test.txt` * 删除最后一行:`sed '$d' test.txt` * 删除所有以 "root" 开头的行:`sed '/^root/d' test.txt` * 删除所有包含 "debug" 的行:`sed '/debug/d' test.txt` * 删除奇数行(显示偶数行):`sed '1~2d' test.txt` 或 `sed -n '2~2p' test.txt` 3. **替换文本:** * 将文件中所有 `old` 替换为 `new`:`sed 's/old/new/g' test.txt` * 仅替换每行第一个 `old`:`sed 's/old/new/' test.txt` (省略 `g`) * 将 `/usr/local/bin` 替换为 `/opt/bin`:`sed 's|/usr/local/bin|/opt/bin|g' test.txt` (使用 `|` 作定界符避免转义 `/`) * 忽略大小写替换:`sed 's/hello/world/gi' test.txt` (将 `hello`, `Hello`, `HELLO` 等替换为 `world`) * 替换并只打印发生替换的行:`sed -n 's/old/new/p' test.txt` 4. **插入/追加/更改行:** * 在第3行前插入一行 "This is inserted":`sed '3i \This is inserted' test.txt` * 在第3行后追加一行 "This is appended":`sed '3a \This is appended' test.txt` * 将包含 "oldtext" 的行整行替换为 "newtext":`sed '/oldtext/c \newtext' test.txt` 5. **写入/读取文件:** * 将所有包含 "important" 的行写入 `notes.txt`:`sed -n '/important/w notes.txt' test.txt` * 在文件末尾插入另一个文件的内容:`sed '$r anotherfile.txt' test.txt` 6. **多点编辑 (多个命令):** * 删除空白行 *并* 将所有 `foo` 替换为 `bar`:`sed -e '/^$/d' -e 's/foo/bar/g' test.txt` * 使用分号分隔命令:`sed '/^$/d; s/foo/bar/g' test.txt` 7. **修改原文件 (务必谨慎!):** * 删除空白行并直接修改原文件(无备份):`sed -i '/^$/d' test.txt` * 删除空白行并修改原文件,同时创建备份 `test.txt.bak`:`sed -i.bak '/^$/d' test.txt` **三、关键提示与最佳实践** 1. **理解默认输出**:除非使用 `-n`,否则 `sed` 会输出模式空间的最终内容(无论是否修改)。 2. **`-i` 选项危险性**:`-i` 会直接覆盖原文件。**强烈建议始终使用带后缀的 `-i.bak` 形式进行备份**,尤其是在重要文件操作前[^2][^4][^5]。 3. **正则表达式**:`sed` 的强大源于正则表达式。熟练掌握正则(BRE 或 ERE)是高效使用 `sed` 的关键[^1][^3][^5]。 4. **地址范围**:地址可以是单一地址(行号/正则)或地址范围(`start,end`)。地址范围非常灵活,如 `/start/,/end/` 表示从一个匹配行 `start` 到下一个匹配行 `end` 之间的所有行。 5. **脚本文件**:对于复杂操作,将多条 `sed` 命令写入一个文件(如 `script.sed`),然后使用 `-f script.sed` 执行更清晰。 6. **测试**:**在进行文件原位修改 (`-i`) 之前,务必在不加 `-i` 的情况下运行命令**,确认输出结果符合预期。 **
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值