Linux命令-sed

时间:2025-04-06 07:13:54

一、简介

sed 命令是通过流编辑的方式来处理和编辑文件的,也就是逐行读取并查找、处理(增、删、改…)数据。

语法: sed [选项] [脚本命令] 文件名 或者 标准输出 | sed [选项] [脚本命令]

常用选项:

-n,                取消默认输出,sed默认会输出所有文本内容,使用-n参数后只显示处理过的行
-i[扩展名]          直接修改文件(如果指定扩展名则备份文件),注意,,不加-i时默认只是预览,不会对文件做实际修改
-h, --help         打印帮助并退出
-V, --version      输出版本信息并退出

脚本命令:

脚本命令是编辑处理文件的主体,它包括行后添加、行前插入、行删除、字符(串)替换、读入写入文件、打印等功能,注意脚本命令需要用引号’'包括

脚本命令 说明
a 在符合匹配条件的行后追加内容,格式:'[address]a[appendstr]''[address]a\(回车后输入追加内容,可多行,以' filename结束输入)
i 在符合匹配条件的行前插入内容,格式:'[address]i[insertstr]''[address]a\(回车后输入插入内容,可多行,以' filename结束输入)
c 将符合匹配条件的行更改为指定内容,格式:'[address]c[changestr]''[address]a\(回车后输入更改内容,但多行测试失败,以' filename结束输入)
d 删除符合匹配条件的行,格式:'[address]d'
s 替换符合匹配条件的内容,格式:'[address]s/pattern/replacement/flags',flags用法见演示实例。
y 将instr对应的每一个字符替换成outstr对应的每一个字符,格式:'[address]y/instr/outstr/' ,注意instr与outstr长度必须相同。
r 在符合匹配条件的行后读入指定文件filename中的内容,格式:'[address]r filename'
w 将符合匹配条件的行写入到filename文件,格式:'[address]w filename'
p 打印符合匹配条件的内容,通常与-n选项和用,格式:'[address]p'
= 打印符合匹配条件的行的行号,格式:'[address]='

查找或匹配范围

注意到上面脚本命令格式中用到了address,它表示的是需要查找或匹配的范围,也就是从指定的范围内进行sed操作,address的语法格式有:

不填                     # 匹配所有行
n                       # 匹配第n行
/pattern/               # 匹配符合/pattern/条件的行
n,m                     # 匹配从第n行开始,到第m行结束
n,+m                    # 匹配从第n行开始,到第n+m行结束
/pattern/,n             # 匹配从符合/pattern/条件的行开始,到第n行结束
/pattern1/,/pattern2/   # 匹配从符合/pattern1/条件的行开始,到符合/pattern2/条件的行结束

二、实例:

首先查看一下需要操作的文件

hollowman@hollowman-F117:~/testdir$ cat 
ooo ooo ooo ooo ooo
iii iii iii iii iii
ooo ooo iii iii ooo
iii iii ooo ooo iii

1.行后追加内容

a 在符合匹配条件的行后追加内容,格式:'[address]a[appendstr]''[address]a\(回车后输入追加内容,可多行,以' filename结束输入)

hollowman@hollowman-F117:~/testdir$ sed '2aiii'     #在第2行后追加iii,注意,因为没有-i选项,并不实际追加,只是预览效果。
ooo ooo ooo ooo ooo
iii iii iii iii iii
iii
ooo ooo iii iii ooo
iii iii ooo ooo iii

2.行前插入内容

i 在符合匹配条件的行前插入内容,格式:'[address]i[insertstr]''[address]a\(回车后输入插入内容,可多行,以' filename结束输入)

hollowman@hollowman-F117:~/testdir$ sed '/ooo/iiii'   #在包含ooo的行前插入iii
iii
ooo ooo ooo ooo ooo
iii iii iii iii iii
iii
ooo ooo iii iii ooo
iii
iii iii ooo ooo iii

3.更改指定行内容

c 将符合匹配条件的行更改为指定内容,格式:'[address]c[changestr]''[address]a\(回车后输入更改内容,但多行测试失败,以' filename结束输入)

hollowman@hollowman-F117:~/testdir$ sed '/ooo/cxxx'    #将包含ooo的行更改为XXX
xxx
iii iii iii iii iii
xxx
xxx

4.删除指定行

d 删除符合匹配条件的行,格式:'[address]d'

hollowman@hollowman-F117:~/testdir$ sed '2,$d'     #删除第2行到最后一行
ooo ooo ooo ooo ooo

5.替换内容

s 替换符合匹配条件的内容,格式:'[address]s/pattern/replacement/flags'

flags用法:

n : 数字,范围1-255,如果每行匹配出的内容有多次,则只替换第n次匹配的内容。
g : 表示替换每行中所有匹配到的内容
3g : 如果每行匹配出的内容有多次,则只从第三次匹配的内容开始替换。
i : 表示匹配时忽略大小写

替换内容replacement的两种特殊形式:

& : 表示引用匹配内容,也就是引用pattern其本身的意思
\n : 对于pattern可以设置子匹配内容,而\n则表示引用第几个匹配,子匹配用小括号()表示,不过放在pattern中时需要用\进行转义,也就是\(\) ,如/\(a\)\(b\)\(c\)/中有3个子字符串分别为a,b,c,而\1,\2,\3分别就表示替换时直接引用a,b,c

hollowman@hollowman-F117:~/testdir$ sed 's/ooo/xxx/2'        #查找每行的所有ooo,但只替换每行中的第二个ooo为xxx
ooo xxx ooo ooo ooo
iii iii iii iii iii
ooo xxx iii iii ooo
iii iii ooo xxx iii
hollowman@hollowman-F117:~/testdir$ sed '2,$s/ooo/xxx/g'     #从第2行开始至末尾,查找并替换每行中的所有ooo为xxx
ooo ooo ooo ooo ooo
iii iii iii iii iii
xxx xxx iii iii xxx
iii iii xxx xxx iii
hollowman@hollowman-F117:~/testdir$ sed 's/two/five/2g'     #查找每行的所有ooo,但只从第二个ooo开始替换成XXX
ooo xxx xxx xxx xxx
iii iii iii iii iii
ooo xxx iii iii xxx
iii iii ooo xxx iii
hollowman@hollowman-F117:~/testdir$ sed 's/OOO/xxx/ig'      #查找并替换每行的所有OOO(不区分大小写)为XXX
xxx xxx xxx xxx xxx
iii iii iii iii iii
xxx xxx iii iii xxx
iii iii xxx xxx iii
hollowman@hollowman-F117:~/testdir$ sed 's/o../&s/g'       #查找所有的以o开头并紧跟任意2个字符的字符串,并替换为其本身(用&表示)+s的新的字符串
ooos ooos ooos ooos ooos
iii iii iii iii iii
ooos ooos iii iii ooos
iii iii ooos ooos iii
hollowman@hollowman-F117:~/testdir$ sed -i 's/\(i\)\(i\)\(i\)/\1a\2b\3c/'   #查找每行的第一个iii,并替换为iaibic,这里的\1,\2,\3分别表示其本身的3个子字符串,每个子字符串用()表示,但注意这里的()需要用\来转义
hollowman@hollowman-F117:~/testdir$ cat 
ooo ooo ooo ooo ooo
iaibic iii iii iii iii
ooo ooo iaibic iii ooo
iaibic iii ooo ooo iii

6.对多个不同的字符进行替换

y 将instr对应的每一个字符替换成outstr对应的每一个字符,格式:'[address]y/instr/outstr/' ,注意instr与outstr长度必须相同。

hollowman@hollowman-F117:~/testdir$ sed 'y/abc/iii/'    #查找所有的a,b,c字符,并分别替换为i,i,i
ooo ooo ooo ooo ooo
iiiiii iii iii iii iii
ooo ooo iiiiii iii ooo
iiiiii iii ooo ooo iii

7.在指定行后读入指定文件的内容

r 在符合匹配条件的行后读入指定文件filename中的内容,格式:'[address]r filename'

hollowman@hollowman-F117:~/testdir$ echo abc > 
hollowman@hollowman-F117:~/testdir$ cat  
abc
hollowman@hollowman-F117:~/testdir$ sed '/ooo/r '    # 在包含ooo的行后读入文件的内容
ooo ooo ooo ooo ooo
abc
iaibic iii iii iii iii
ooo ooo iaibic iii ooo
abc
iaibic iii ooo ooo iii
abc

8.符合条件的行写入指定文件

w 将符合匹配条件的行写入到filename文件,格式:'[address]w filename'

hollowman@hollowman-F117:~/testdir$ sed '/ooo/w '    #将包含ooo的行写入文件,此命令会覆盖文件中原来的内容
ooo ooo ooo ooo ooo
iaibic iii iii iii iii
ooo ooo iaibic iii ooo
iaibic iii ooo ooo iii
hollowman@hollowman-F117:~/testdir$ cat  
ooo ooo ooo ooo ooo
ooo ooo iaibic iii ooo
iaibic iii ooo ooo iii