前言
sed 全称(stream edit directory)翻译为流式编辑器,工具的定位为编辑器类似vim 但比vim 更强大好用;支持多种场景:1.常用的(增,删,改,查)需求;2.支持非交互式修改文档,逐行处理
提示:以下是本篇文章正文内容,下面案例可供参考
一、语法
sed 选项 (定位符) 操作指令 文件名
或
管道命令| sed 选项 (定位符) 指令
- 选项:
- -n # 屏蔽默认输出
- -r # 支持扩展正则表达式,使用反 / 引起来(如:“/字符串或者正则表达式/”)
- -i # 写入文件是一个不可逆操作(与-r 一起使用时,写法为 -ri ;i 要放在后面)
- 指令
- p # print 打印到屏幕
- d # del 删除
- c # 行替换(会替换掉匹配的整行)
- s #关键字替换(按行)
- = # 打印行号
二、常用指令和使用方法
1. 查询
说明:常用定位符来打印不同位置的信息记录;代码如下(示例)
#行号定位
[root@svr7 ~] # sed -n "3p" /etc/passwd #打印 第3行信息
[root@svr7 ~] # sed -n "3,5p" /etc/passwd #打印 第3~5行,闭区间
[root@svr7 ~] # sed -n "3,+2p" /etc/passwd #打印 第3行,之后再加2行
[root@svr7 ~] # sed -n "1~2p" /etc/passwd #打印奇数行 1~2;(1:代表第一个奇数,2代表布长,在第一个奇数上+2个不就是奇数了)
[root@svr7 ~] # sed -n "2~2p" /etc/passwd #打印偶数行
#正则定位
[root@svr7 ~] # sed -nr "/(root)/p" /etc/passwd #打印包含有root字符的行
[root@svr7 ~] # sed -nr "/[0-9]+/p" /etc/passwd #打印包含有数字字符的行
# 打印行号(=)
[root@svr7 ~] # sed -n '=' /etc/passwd #打印每一行的行号
[root@svr7 ~] # sed -n '2=' /etc/passwd #打印第二行的行号
[root@svr7 ~] # sed -n '$=' /etc/passwd #打印最后一行的行号 $代表最后一行
[root@svr7 ~] # sed -n '/^root/=' /etc/passwd #打印以root开始行号
2. 更新
2.1 插入
- insert:向上插入
# 插入(i) insert
sed -n '2i abc' /etc/passwd #向第二行前插入 abc 字符
sed -n '/2046/i ABC' test.txt #向满足条件2046关键字的行前插入ABC 字符
- append :向下追加
# 追加(a) append
sed -n '2a abc' /etc/passwd #向第二行后插入 abc 字符
sed '/2046/a ABC\nXYZ' test.txt #向包含2046的行后插入 2行ABC XYZ ,\n代表换行的意思
- read : 导入外部文件内容,默认为行后
# 导入(r) read
sed '2r /host/hosts' test.txt #将文件hosts的内容导入到 test.txt 第二行后
- write :导出文件内容
# 导出(w) write
sed '/2046/w 2046.txt' test.txt #将 test文件包含2046行的内容导入到2046.txt文件内
2.2 删除
删除单位为行,可支持多行,单号,不连续行
sed -n '2d' /etc/passwd #删除第二行
sed -n '1,3d' /etc/passwd #删除1~3行
sed -n '2,+3d' /etc/passwd #删除第二行,再加3行
sed -n '1~2d' /etc/passwd #删除奇数行
#使用正则表达式
sed -n '/bash$/d' /etc/passwd #删除已bash结尾的行
sed -n '/^$/d' /etc/passwd #删除空行,^$代表正则表达式的空行
sed -n '/^#/d' /etc/passwd #删除以#开头的行
sed -n '/^#/! d' /etc/passwd #删除不以#开头的行 !代表取反
2.3 替换
- 整行替换 (指令c)
sed -n '2c abc' /etc/passwd #将第2行替换为 abc字符串
sed -n '1~2c abc' /etc/passwd #将奇数行替换为 abc
sed -n '2~2c abc' /etc/passwd #将偶数行替换为 abc
sed -n '/^root/c abc' /etc/passwd #将root 开头的行替换为abc
sed -n 'c abc' /etc/passwd #没有定位符,代表逐行全部替换为abc
sed -n '/IPADD/c IPADDR=192.168.4.7' ifcg_eth1 #将IPADD 开头的行同行为 IPADDR=192.168.4.7
- 关键字替换 (指令s)
将指定的关键字替换为新的值
用法:s/old_value/new_value/定位符|g(全局) ,默认的替换符为/ ,已可以使用其他的其他符
[root@svr7 shells]# cat test.txt #查看文件的内容
2046 2048 2046 2046
1001 2046 2999 1888
2046 2046 2046 2046
[root@svr7 shells]# sed 's/2046/abc/' test.txt #将2046替换为abc 默认只替换满足条件的第一个字符,s前面不加定位符时,
代表逐行替换
abc 2048 2046 2046
1001 abc 2999 1888
abc 2046 2046 2046
[root@svr7 shells]# sed 's/2046/abc/g' test.txt # 加g=globe 代表全局,满足条件的都替换
abc 2048 abc abc
1001 abc 2999 1888
abc abc abc abc
[root@svr7 shells]# sed '1s/2046/abc/g' test.txt #只替换第1行满足添加的关键字,并且是全局的。
abc 2048 abc abc
1001 2046 2999 1888
2046 2046 2046 2046
[root@svr7 shells]# sed '1s/2046/abc/2' test.txt #如果新词后面是数字代表只满足条件的第几个,这里是第2个
2046 2048 abc 2046
1001 2046 2999 1888
2046 2046 2046 2046
[root@svr7 shells]# sed 's/2046/<&>/g' test.txt # "&"表示引用旧词,来作为新词
<2046> 2048 <2046> <2046>
1001 <2046> 2999 1888
<2046> <2046> <2046> <2046>
[root@svr7 shells]# sed '/^1001/s /2046/<&>/g' test.txt # 同样的可以使用正则表达式
2046 2048 2046 2046
1001 <2046> 2999 1888
2046 2046 2046 2046
[root@svr7 shells]# sed -n '2s/2046/XXXX/p' test.txt # p 代表打印显示,如果-n是屏蔽掉打印的,加p可以再次打印输出一下
#主要-i 不要和p一起用
1001 XXXX 2999 1888
[root@svr7 shells]# sed '2s/2046//' test.txt # 新词没有内容表示替换为空值
2046 2048 2046 2046
1001 2999 1888
2046 2046 2046 2046
使用正则表达式的保留(),保留括号里的字符,\位置号, 表示复制保留中的内容第几个
[root@svr7 shells]# echo 'hello the world' | sed -r 's/^(.)(.*)(.)$/\3\2\1/' # 开始h,结尾d 互换
dello the worlh
总结
流式编辑器在进行文本的处理和检索比起vim 更加的灵活,特别是文件比较大时,使用sed的非交互模式进行批量处理可以大大的加快工作的效率。