三剑客之流式编辑器(sed)


前言

sed 全称(stream edit directory)翻译为流式编辑器,工具的定位为编辑器类似vim 但比vim 更强大好用;支持多种场景:1.常用的(增,删,改,查)需求;2.支持非交互式修改文档,逐行处理


提示:以下是本篇文章正文内容,下面案例可供参考

一、语法

sed 选项 (定位符) 操作指令 文件名

管道命令| sed 选项 (定位符) 指令

  1. 选项:
    • -n # 屏蔽默认输出
    • -r # 支持扩展正则表达式,使用反 / 引起来(如:“/字符串或者正则表达式/”)
    • -i # 写入文件是一个不可逆操作(与-r 一起使用时,写法为 -ri ;i 要放在后面)
  2. 指令
    • 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的非交互模式进行批量处理可以大大的加快工作的效率。

  • 9
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值