一、简介
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