sed 用法介绍

sed 用法介绍

s e d是一个非交互性文本流编辑器。它编辑文件或标准输入导出的文本拷贝。

引用:
• 抽取域。
• 匹配正则表达式。
• 比较域。
• 增加、附加、替换。
• 基本的s e d命令和一行脚本。


可 以在命令行输入s e d命令,也可以在一个文件中写入命令,然后调用s e d,这与a w k基本相同。使用s e d需要记住的一个重要事实是,无论命令是什么, s e d并不与初始化文件打交道,它操作的只是一个拷贝,然后所有的改动如果没有重定向到一个文件,将输出到屏幕。

因为s e d是一个非交互性编辑器,必须通过行号或正则表达式指定要改变的文本行。
本文介绍s e d用法和功能。本章大多编写的是一行命令和小脚本。这样做可以慢慢加深对s e d用法的了解,取得宝贵的经验,以便最终自己编出大的复杂s e d脚本。
和g r e p与a w k一样, s e d是一种重要的文本过滤工具,或者使用一行命令或者使用管道与g r e p与a w k相结合。

1 sed怎样读取数据

s e d从文件的一个文本行或从标准输入的几种格式中读取数据,将之拷贝到一个编辑缓冲区,然后读命令行或脚本的第一条命令,并使用这些命令查找模式或定位行号编辑它。重复此过程直到命令结束。

2 调用sed

调用s e d有三种方式:在命令行键入命令;将s e d命令插入脚本文件,然后调用s e d;将s e d命令插入脚本文件,并使s e d脚本可执行。

使用s e d命令行格式为:
代码:
sed [选项] s e d命令输入文件。

记住在命令行使用s e d命令时,实际命令要加单引号。s e d也允许加双引号。

使用s e d脚本文件,格式为:
代码:
sed [选项] -f sed脚本文件输入文件


要使用第一行具有s e d命令解释器的s e d脚本文件,其格式为:
代码:
s e d脚本文件[选项] 输入文件


不管是使用s h e l l命令行方式或脚本文件方式,如果没有指定输入文件, s e d从标准输入中接受输入,一般是键盘或重定向结果。

引用:
s e d选项如下:
n 不打印;s e d不写编辑行到标准输出,缺省为打印所有行(编辑和未编辑)。p命令可以用来打印编辑行。
c 下一命令是编辑命令。使用多项编辑时加入此选项。如果只用到一条s e d命令,此选项无用,但指定它也没有关系。
f 如果正在调用s e d脚本文件,使用此选项。此选项通知s e d一个脚本文件支持所有的s e d命令,例如:sed -f myscript.sed input_file,这里m y s c r i p t . s e d即为支持s e d命令的文件。


2.1 保存sed输出
由于不接触初始化文件,如果想要保存改动内容,简单地将所有输出重定向到一个文件即可。下面的例子重定向s e d命令的所有输出至文件‘ m y o u t f i l e’,当对结果很满意时使用这种方法。
代码:
$sed 'some-sed-commands' input-file > myoutfile


2.2 使用sed在文件中查询文本的方式
s e d浏览输入文件时,缺省从第一行开始,有两种方式定位文本:
引用:
1) 使用行号,可以是一个简单数字,或是一个行号范围。
2 ) 使用正则表达式


下面是使用s e d定位文本的一些方式。

代码:
x x为一行号,如1
x , y 表示行号范围从x到y,如2,5表示从第2行到第5行
/ p a t t e r n / 查询包含模式的行。例如/ d i s k /或/[a-z]/
/ p a t t e r n / p a t t e r n / 查询包含两个模式的行。例如/ d i s k / d i s k s /
p a t t e r n / , x 在给定行号上查询包含模式的行。如/ r i b b o n / , 3
x , / p a t t e r n / 通过行号和模式查询匹配行。3 . / v d u /
x , y ! 查询不包含指定行号x和y的行。1 , 2 !


2.3 基本sed编辑命令

代码:
sed编辑命令
p 打印匹配行
= 显示文件行号
a / 在定位行号后附加新文本信息
i / 在定位行号后插入新文本信息
d 删除定位行
c / 用新文本替换定位文本
s 使用替换模式替换相应模式
r 从另一个文件中读文本
w 写文本到一个文件
q 第一个模式匹配完成后推出或立即推出
l 显示与八进制A S C I I代码等价的控制字符
{ } 在定位行执行的命令组
n 从另一个文件中读文本下一行,并附加在下一行
g 将模式2粘贴到/pattern n/
y 传送字符
n 延续到下一输入行;允许跨行的模式匹配语句




sed和正则表达式

s e d识别任何基本正则表达式和模式及其行匹配规则。记住规则之一是:如果要定位一特殊字符,必须使用( /)屏蔽其特殊含义


s e d例子中使用下述文本文件q u o t e . t x t。

代码:
[sam@Linux_chenwy sam]$ 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:00.
The local nurse Miss P.Neave was in attendance.



1 使用p(rint)显示行
只打印第二行,用-n

代码:
[sam@Linux_chenwy sam]$ sed -n '2p' quote.txt
It was an evening of splendid music and company.



2 打印范围
可以指定行的范围,现打印1到3行,用逗号分隔行号。

代码:
[sam@Linux_chenwy sam]$ 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:00.



3 打印模式
假定要匹配单词N e a v e,并打印此行,方法如下。使用模式/ p a t t e r n /格式,这里为/ N e a v e /。

代码:
[sam@Linux_chenwy sam]$ 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.



4 使用模式和行号进行查询
可以将行号和模式结合使用。假定要改动文件q u o t e . t x t最后一行中的单词t h e,使用s e d查询t h e,返回两行:

代码:
[sam@Linux_chenwy sam]$ 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.



使用模式与行号的混合方式可以剔除第一行,格式为l i n e _ n u m b e r, / p a t t e r n /。逗号用来分隔行号与模式开始部分。为达到预期结果,使用4 , / t h e /。意即只在第四行查询模式t h e,命令如下:

代码:
[sam@Linux_chenwy sam]$ sed -n '4,/The/p' quote.txt
The local nurse Miss P.Neave was in attendance.


上面有错,其实是把第四行后的都打出来了
这个模式应该哪果指定行找不到符合条件的,就从下一行开始查找,直到找到为止,并把,找到行之前的全部打打印出来。
如果指定行本身就符合条伯,把本行及后面的行的全部打印出来


5 匹配元字符
匹配元字符$前,必须使用反斜线/屏蔽其特殊含义。模式为//$/ p。

代码:
[sam@Linux_chenwy sam]$ sed -n '//$/p' quote.txt
The honeysuckle band played all night long for only $90.



6 显示整个文件
要打印整个文件,只需将行范围设为第一行到最后一行1 , $。$意为最后一行。

代码:
[sam@Linux_chenwy sam]$ 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:00.
The local nurse Miss P.Neave was in attendance.



7 任意字符
匹配任意字母,后跟任意字母的0次或多次重复,并以i n g结尾,模式为/ . * i n g /。可以使用这个模式查询以i n g结尾的任意单词。

代码:
[sam@Linux_chenwy sam]$ sed -n '/.*ing/p' quote.txt
It was an evening of splendid music and company.



8 首行
要打印文件第一行,使用行号:

代码:
[sam@Linux_chenwy sam]$ sed -n '1p' quote.txt
The honeysuckle band played all night long for only $90.



9 最后一行
要打印最后一行,使用$。$是代表最后一行的元字符。

代码:
[sam@Linux_chenwy sam]$ sed -n '$p' quote.txt
The local nurse Miss P.Neave was in attendance.



10 打印行号
要打印行号,使用等号=。打印模式匹配的行号,使用格式/ p a t t e r n / =。

代码:
[sam@Linux_chenwy sam]$ 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:00.
The local nurse Miss P.Neave was in attendance.



整个文件都打印出来,并且匹配行打印了行号。如果只关心实际行号,使用- e选项。

代码:
[sam@Linux_chenwy sam]$ sed -n '/music/=' quote.txt
2



如果只打印行号及匹配行,必须使用两个s e d命令,并使用e选项。第一个命令打印模式匹配行,第二个使用=选项打印行号,格式为sed -n -e /pattern/p -e /pattern/=

代码:
[sam@Linux_chenwy sam]$ sed -n -e '/music/p' -e '/music/='  quote.txt
It was an evening of splendid music and company.
2


P.S:新版本的sed(GNU sed version 4.0.5)带有-i选项,允许直接编辑修改文件内容而不需要重定向到临时文件
例如:
/home/lee#cat file
old
abc
/home/lee#sed -i 's/old/new/' file
/home/lee#cat file
new
abc

11 附加文本

要 附加文本,使用符号a /,可以将指定文本一行或多行附加到指定行。如果不指定文本放置位置, s e d缺省放在每一行后面。附加文本时不能指定范围,只允许一个地址模式。文本附加操作时,结果输出在标准输出上。注意它不能被编辑,因为s e d执行时,首先将文件的一行文本拷贝至缓冲区,在这里s e d编辑命令执行所有操作(不是在初始文件上),因为文本直接输出到标准输出,s e d并无拷贝。
要想在附加操作后编辑文本,必须保存文件,然后运行另一个s e d命令编辑它。这时文件的内容又被移至缓冲区。
附加操作格式如下:

代码:
[address]a/
text/
text/
......
text


地 址指定一个模式或行号,定位新文本附加位置。a/ 通知s e d对a /后的文本进行实际附加操作。观察格式,注意每一行后面有一斜划线,这个斜划线代表换行。s e d执行到这儿,将创建一新行,然后插入下一文本行。最后一行不加斜划线, s e d假定这是附加命令结尾。

当附加或插入文本或键入几个s e d命令时,可以利用辅助的s h e l l提示符以输入多行命令。当附加或插入文本或键入几个s e d命令时,可以利用辅助的s h e l l提示符以输入多行命令。

创建sed脚本文件

创建脚本文件a p p e n d . s e d:
第一行是s e d命令解释行。脚本在这一行查找s e d以运行命令,这里定位在/ b i n。
第二行以/ c o m p a n y /开始,这是附加操作起始位置。a /通知s e d这是一个附加操作,首先应插入一个新行。
第三行是附加操作要加入到拷贝的实际文本。
输出显示附加结果。如果要保存输出,重定向到一个文件。
代码:
[sam@chenwy sam]$ cat append.sed
#!/bin/sed -f
/company/ a/
Then suddenly it happed.

保存它,增加可执行权限,运行

代码:
[sam@chenwy sam]chmod u+x append.sed
[sam@chenwy sam]$ ./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 happed.
Too bad the disco floor fell through at 23:00.
The local nurse Miss P.Neave was in attendance.


或直接用命令行:
代码:
[sam@chenwy sam]$ sed "/company/a/Then suddenly it happened." 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.
Too bad the disco floor fell through at 23:00.
The local nurse Miss P.Neave was in attendance.



[sam@chenwy sam]$ sed "/company/i/utter confusion followed." quote.txt
The honeysuckle band played all night long for only $90.
utter confusion followed.
It was an evening of splendid music and company.
Too bad the disco floor fell through at 23:00.
The local nurse Miss P.Neave was in attendance.

插入文本:
插入命令类似于附加命令,只是在指定行前面插入。和附加命令一样,它也只接受一个地址。
如在a t t e n d a n c e结尾的行前插入文本utter confusion followed。
代码:
[sam@chenwy sam]$ sed "/company/i/Utter confusion followed." quote.txt


也可以指定行:
代码:
[sam@chenwy sam]$ cat insert.sed
#!/bin/sed -f
4 i/
Utter confusion followed.


执行结果
代码:
[sam@chenwy sam]$ chmod u+x insert.sed
[sam@chenwy sam]$ ./insert.sed 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:00.
Utter confusion followed.
The local nurse Miss P.Neave was in attendance.


修改文本
修改命令将在匹配模式空间的指定行用新文本加以替代,格式如下:
将 第一行The honeysuckle band played all night long for only $90替换为The office Di b b l e band played well。首先要匹配第一行的任何部分,可使用模式‘ / H o n e y s u c k l e /’。s e d脚本文件为c h a n g e . s e d。内容如下:
代码:
[sam@chenwy sam]$ cat change.sed
#!/bin/sed -f
3 c/
The office Dibble band played well.


代码:
[sam@chenwy sam]$ chmod u+x change.sed
[sam@chenwy sam]$ ./change.sed quote.txt
The honeysuckle band played all night long for only $90.
It was an evening of splendid music and company.
The office Dibble band played well.
The local nurse Miss P.Neave was in attendance.


或命令行:
代码:
[sam@chenwy sam]$ sed "/honeysuck/c/The Office Dibble band played well." quote.txt
The Office Dibble band played well.
It was an evening of splendid music and company.
Too bad the disco floor fell through at 23:00.
The local nurse Miss P.Neave was in attendance.


可以对同一个脚本中的相同文件进行修改、附加、插入三种动作匹配和混合操作。
代码:
[sam@chenwy sam]$ cat mix.sed
#!/bin/sed -f
1 c/
The Dibble band were grooving.

/evening/ i/
They played some great tunes.

3 a/
Where was the nurse to help?


代码:
[sam@chenwy sam]$ chmod u+x mix.sed
[sam@chenwy sam]$ ./mix.sed quote.txt
The Dibble band 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:00.
Where was the nurse to help?
The local nurse Miss P.Neave was in attendance.


删除文本
s e d删除文本格式:
代码:
[ a d d r e s s [,a d d r e s s ] ] d


删除第一行;1 d意为删除第一行。
代码:
[sam@chenwy sam]$ sed '1d' quote.txt
It was an evening of splendid music and company.
Too bad the disco floor fell through at 23:00.
The local nurse Miss P.Neave was in attendance.


删除第一到第三行:
代码:
[sam@chenwy sam]$ sed '1,3d' quote.txt
The local nurse Miss P.Neave was in attendance.


删除最后一行:
代码:
[sam@chenwy sam]$ sed '$d' 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:00.


也可以使用正则表达式进行删除操作。下面的例子删除包含文本‘ N e a v e’的行。
代码:
[sam@chenwy sam]$ sed '/Neave/d' 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:00.


替换文本
替换命令用替换模式替换指定模式,格式为:
代码:
[ a d d r e s s [,address]] s/ pattern-to-find /replacement-pattern/[g p w n]

s选项通知s e d这是一个替换操作,并查询p a t t e r n - t o - f i n d,成功后用r e p l a c e m e n t - p a t t e r n替换它。
替换选项如下:

引用:
g 缺省情况下只替换第一次出现模式,使用g选项替换全局所有出现模式。
p 缺省s e d将所有被替换行写入标准输出,加p选项将使- n选项无效。- n选项不打印输出结果。
w 文件名使用此选项将输出定向到一个文件。


如替换n i g h t为N I G H T,首先查询模式n i g h t,然后用文本N I G H T替换它。
代码:
[sam@chenwy sam]$ 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:00.
The local nurse Miss P.Neave was in attendance.


要从$ 9 0 中删除$ 符号(记住这是一个特殊符号,必须用/ 屏蔽其特殊含义),在r e p l a c e m e n t - p a t t e r n部分不写任何东西,保留空白,但仍需要用斜线括起来。在s e d中也可以这样删除一个字符串。
代码:
[sam@chenwy sam]$ 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:00.
The local nurse Miss P.Neave was in attendance.


要进行全局替换,即替换所有出现模式,只需在命令后加g选项。下面的例子将所有T h e替换成Wo w!。
代码:
[sam@chenwy sam]$ 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:00.
Wow! local nurse Miss P.Neave was in attendance.


将替换结果写入一个文件用w选项,下面的例子将s p l e n d i d替换为S P L E N D I D的替换结果写入文件s e d . o u t:
代码:
[sam@chenwy sam]$ 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:00.
The local nurse Miss P.Neave was in attendance.


注意要将文件名括在s e d的单引号里。文件结果如下:
代码:
[sam@chenwy sam]$ cat sed.out
It was an evening of SPLENDID music and company.

使用替换修改字符串
如果要附加或修改一个字符串,可以使用(&)命令,&命令保存发现模式以便重新调用它,然后把它放在替换字符串里面。
先给出一个被替换模式,然后是一个准备附加在第一个模式后的另一个模式,并且后面带有&,这样修改模式将放在匹配模式之前。
例如, s e d语句s/nurse/"Hello"&/p 的结果如下
代码:
[sam@chenwy sam]$ 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。
记住模式中要使用空格,因为输出结果表明应加入空格。

还有一个例子:
代码:
[sam@chenwy sam]$ 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。

将sed结果写入文件命令
像使用>文件重定向发送输出到一个文件一样,在s e d命令中也可以将结果输入文件。格式有点像使用替换命令:
代码:
[ a d d r e s s [,address]]w filename

‘w’选项通知s e d将结果写入文件。f i l e n a m e是自解释文件名。
下面有两个例子。
代码:
[sam@chenwy sam]$ sed '1,2 w filedt' 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:00.
The local nurse Miss P.Neave was in attendance.


文件q u o t e . t x t输出到屏幕。模式范围即1,2行输出到文件f i l e d t。
代码:
[sam@chenwy sam]$ cat filedt
The honeysuckle band played all night long for only $90.
It was an evening of splendid music and company.


下面例子中查询模式N e a v e,匹配结果行写入文件f i l e d h t。
代码:
[sam@chenwy sam]$ sed '/Neave/ w dht' 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:00.
The local nurse Miss P.Neave was in attendance.


代码:
[sam@chenwy sam]$ cat dht
The local nurse Miss P.Neave was in attendance.



从文件中读文本
处理文件时, s e d允许从另一个文件中读文本,并将其文本附加在当前文件。此命令放在模式匹配行后,格式为:
代码:
address r filename

这里r通知s e d将从另一个文件源中读文本。f i l e n a m e是其文件名。

现在创建一个小文件s e d e x . t x t,内容如下:
代码:
[sam@chenwy sam]$ echo "Boom boom went the music" >sedex.txt
[sam@chenwy sam]$ cat sedex.txt
Boom boom went the music


将s e d e x . t x t内容附加到文件q u o t e . t x t的拷贝。在模式匹配行/ c o m p a n y /后放置附加文本。本例为第三行。注意所读的文件名需要用单引号括起来。
代码:
[sam@chenwy sam]$ 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:00.
The local nurse Miss P.Neave was in attendance.



匹配后退出
有时需要在模式匹配首次出现后退出s e d,以便执行其他处理脚本。退出命令格式为:
代码:
address q

下面的例子假定查询模式/ . a . * /,意为任意字符后跟字符a,再跟任意字符0次或任意多次。
查询首次出现模式,然后退出。需要将q放在s e d语句末尾。
代码:
[sam@chenwy sam]$ sed '/.a.*/q' quote.txt
The honeysuckle band played all night long for only $90.

显示文件中的控制字符

1、$vi dos.txt
进入vi后,用ctrl+v 再用ctrl+M产生控制字符^M不知对不对


使用cat -v filename命令查看编辑好的文件
代码:
[sam@chenwy sam]$ cat -v dos.txt
12332##DISO##45.12^M
00332##LPSO##23.14^M
01299##USPD##34.46^M


s e d格式为:
代码:
[ a d d r e s s,[ a d d r e s s ] ] l

‘l’意为列表。一般情况下要列出整个文件,而不是模式匹配行,因此使用l要从第一到最后一行。模式范围1,$即为此意。
代码:
[sam@chenwy sam]$ sed -n '1,$l' dos.txt
12332##DISO##45.12/r$
00332##LPSO##23.14/r$
01299##USPD##34.46/r$


处理控制字符
使用s e d实现的一个重要功能是在另一个系统中下载的文件中剔除控制字符。
下面是传送过来的文件( d o s . t x t)的部分脚本。必须去除所有可疑字符,以便于帐号所有者使用文件。

删除所有的#字符很容易,可以使用全局替换命令。这里用一个空格替换两个或
更多的#符号。
代码:
[sam@chenwy sam]$ sed 's/##/ /g' dos.txt
12332 DISO 45.12
00332 LPSO 23.14
01299 USPD 34.46


。删除所有行首的0。使用^符号表示模式从行首开始, ^ 0 *表示行首任意个0。模式s / ^ 0 * / / g设置替换部分为空,即为删除模式,正是要求所在。
代码:
[sam@chenwy sam]$ sed 's/##/ /g;s/^0*/ /g' dos.txt
12332 DISO 45.12
332 LPSO 23.14
1299 USPD 34.46


最后去除行尾^ M符号,为此需做全局替换。设置替换部分为空。模式为:
‘s / ^ m / / g’,注意‘^ M’,这是一个控制字符。
在命令行里也必须用^M控制字符耶!?
代码:
[sam@chenwy sam]$ sed 's/##/ /g;s/^0*/ /g;s/^M/ /g' dos.txt
12332 DISO 45.12
332 LPSO 23.14
1299 USPD 34.46



代码:
[sam@chenwy sam]$ cat dos.txt | sed 's/^0*/ /g' | sed 's/^M/ /g' | sed 's/##/ /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` 的情况下运行命令**,确认输出结果符合预期。 **
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值