Linux命令-sed

一、简介

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 sed.txt
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' sed.txt    #在第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' sed.txt  #在包含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' sed.txt   #将包含ooo的行更改为XXX
xxx
iii iii iii iii iii
xxx
xxx

4.删除指定行

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

hollowman@hollowman-F117:~/testdir$ sed '2,$d' sed.txt    #删除第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' sed.txt       #查找每行的所有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' sed.txt    #从第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' sed.txt    #查找每行的所有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' sed.txt     #查找并替换每行的所有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' sed.txt      #查找所有的以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/' sed.txt  #查找每行的第一个iii,并替换为iaibic,这里的\1,\2,\3分别表示其本身的3个子字符串,每个子字符串用()表示,但注意这里的()需要用\来转义
hollowman@hollowman-F117:~/testdir$ cat sed.txt
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/' sed.txt   #查找所有的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 > read.txt
hollowman@hollowman-F117:~/testdir$ cat read.txt 
abc
hollowman@hollowman-F117:~/testdir$ sed '/ooo/r read.txt' sed.txt   # 在包含ooo的行后读入read.txt文件的内容
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 read.txt' sed.txt   #将包含ooo的行写入read.txt文件,此命令会覆盖read.txt文件中原来的内容
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 read.txt 
ooo ooo ooo ooo ooo
ooo ooo iaibic iii ooo
iaibic iii ooo ooo iii
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值