sed命令

sed命令

一、sed编辑器

  • sed编辑器可以根据命令来处理数据流中的数据,这些命令要么从命令行中输入,要么存储在一个命令文本文件中

sed工作过程

  • 读取:sed从输入流 (文件、管道、标准输入) 中读取一行内容并存储到临时的缓冲区中(又称模式空间,pattern space)
  • 执行:默认情况下,所有的sed命令都在模式空间中顺序地执行,除非指定了行的地址,否则sed命令将会在所有的行上依次执行。
  • 显示:发送修改后的内容到输出流。在发送数据后,模式空间将会被清空。在所有的文件内容都被处理完成之前,上述过程将重复执行,直至所有内容被处理完。

在所有的文件内容都被处理完成之前,上述过程将重复执行,直至所有内容被处理完。

注意:默认情况下所有的sed命令都是在模式空间内执行的,因此输入的文件并不会发生任何变化,除非是用重定向存储输出。

二、sed命令

1、命令格式

sed [option]... 'script;script;...' [input  file...]
     选项         自身脚本语法         支持标准输入管道

2、常用选项

选项说明
-n关闭自动打印,可以与p命令一起使用完成输出
-i真正修改编辑文件
-i.bak修改之前,先备份原文件,在原文件后加上bak(bak没有限制,可以自定义)
-r使用扩展正则表达式
-e多点编辑,表示用指定命令来处理输入的文本文件,只有一个操作命令时可省略,一般在执行多个操作命令使用
-f从指定文件中读取编辑脚本

3、常用操作

选项说明
a增加,在下面插入内容,需要真正修改时,要加-i选项
i前面插入,在选定行上面插入一行指定内容
c替换,将选定行替换为指定内容
p打印,如果同时指定行,表示打印指定行;如果不指定行,则表示打印所有内容;其通常与“-n”选项一起使用 =: 打印行号
q退出
d删除,删除选定的行
s替换,替换指定字符
y字符转换,转换前后的字符长度必须相同
w保存模式匹配的行至指定文件
r读取指定文件的文本至模式空间中匹配的行后
#在第5行下方插入
[root@localhost ~]#seq 10|sed '5axxxx'
1
2
3
4
5
xxxx
6
7
8
9
10

#在第5行上方插入
[root@localhost ~]#seq 10|sed '5ixxxx'
1
2
3
4
xxxx
5
6
7
8
9
10

#替换第5行内容
[root@localhost ~]#seq 10|sed '5cxxxx'
1
2
3
4
xxxx
6
7
8
9
10

#打印第6行
[root@localhost ~]#seq 10 |sed -n '6p'
6

#删除第5行
[root@localhost ~]#seq 10 |sed '5d'
1
2
3
4
6
7
8
9
10

[root@localhost ~]#cat test
aaaaa
bbbbb
ccccc
ddddd
#将test文件中的第2行写入xx.txt文件
[root@localhost ~]#sed -n '2wxx.txt' test
[root@localhost ~]#cat xx.txt
bbbbb

#将/etc/issue文件中的内容当做参数写入到test文件的第3行下面
[root@localhost ~]#cat test|sed '3r /etc/issue'
aaaaa
bbbbb
ccccc
\S
Kernel \r on an \m

ddddd

image-20240130143152517

image-20240130150213138

image-20240130150023856

4、搜索替代

4.1 格式
  • s/旧内容/新内容/修饰符

    旧内容:可以用正则表达式

    新内容:一定是固定的字符串(要修改的内容是一定的,不能用正则表达式)

修饰符说明
g行内全局替换
p显示替换成功的行
i忽略大小写
w将替换成功的行保存至文件中
#查看/etc/selinux/config文件
[root@localhost ~]#cat /etc/selinux/config

# This file controls the state of SELinux on the system.
# SELINUX= can take one of these three values:
#     enforcing - SELinux security policy is enforced.
#     permissive - SELinux prints warnings instead of enforcing.
#     disabled - No SELinux policy is loaded.
SELINUX=enforcing
# SELINUXTYPE= can take one of three two values:
#     targeted - Targeted processes are protected,
#     minimum - Modification of targeted policy. Only selected processes are protected.
#     mls - Multi Level Security protection.
SELINUXTYPE=targeted

#将/etc/selinux/config文件中的SELINUX=enforcing替换为SELINUX=disable
[root@localhost ~]#sed -i.text 's/SELINUX=enforcing/SELINUX=disable/' /etc/selinux/config

#查看/etc/selinux/config文件
[root@localhost ~]#cat /etc/selinux/config

# This file controls the state of SELinux on the system.
# SELINUX= can take one of these three values:
#     enforcing - SELinux security policy is enforced.
#     permissive - SELinux prints warnings instead of enforcing.
#     disabled - No SELinux policy is loaded.
SELINUX=disable
# SELINUXTYPE= can take one of three two values:
#     targeted - Targeted processes are protected,
#     minimum - Modification of targeted policy. Only selected processes are protected.
#     mls - Multi Level Security protection.
SELINUXTYPE=targeted

image-20240130151627608

#不用进配置文件,修改httpd端口
[root@localhost ~]#sed -ir 's/Listen 80/Listen 1128/' /etc/httpd/conf/httpd.conf
[root@localhost ~]#
[root@localhost ~]#grep 1128  /etc/httpd/conf/httpd.conf
Listen 1128

image-20240130164723524

4.2 指代变量—&
[root@localhost ~]#grep "r..t" /etc/passwd
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin

#将文件中的r..t替换为r..tmak(&:指代找到的旧内容)
[root@localhost ~]#sed 's/r..t/&mak/g' /etc/passwd
rootmak:x:0:0:rootmak:/rootmak:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
operator:x:11:0:operator:/rootmak:/sbin/nologin
games:x:12:100:games:/usr/games:/sbin/nologin
ftp:x:14:50:FTP User:/var/ftmakp:/sbin/nologin
nobody:x:99:99:Nobody:/:/sbin/nologin

image-20240130152630227

4.3 分组替换

格式

  • s//代表查找替换 ()代表分组 \1 代表留下的组
#分组替换,()表示分的组,\1或者\2或者\3表示留下来的组
[root@localhost ~]#echo 123abcxyz |sed -r 's/(123)(abc)(xyz)/\1/'
123
[root@localhost ~]#echo 123abcxyz |sed -r 's/(123)(abc)(xyz)/\2/'
abc
[root@localhost ~]#echo 123abcxyz |sed -r 's/(123)(abc)(xyz)/\1\2/'
123abc

#可以指定分组输出的顺序
[root@localhost ~]#echo 123abcxyz |sed -r 's/(123)(abc)(xyz)/\2\1/'
abc123

image-20240130155808093

[root@localhost ~]#ifconfig ens33
ens33: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 192.168.10.11  netmask 255.255.255.0  broadcast 192.168.10.255
        inet6 fe80::53e9:a034:7de9:f2b9  prefixlen 64  scopeid 0x20<link>
        ether 00:0c:29:42:0c:18  txqueuelen 1000  (Ethernet)
        RX packets 855038  bytes 1201177005 (1.1 GiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 277864  bytes 17105648 (16.3 MiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
#提取本机ip地址(分组替换)
[root@localhost ~]#ifconfig ens33|sed -nr '2s/.*inet (.*)  netmask.*/\1/p'
192.168.10.11

image-20240130160316886

4.4 变量
#匹配/etc/passwd文件中的root字符
[root@localhost ~]#name=root
[root@localhost ~]#sed -nr '/$name/p' /etc/passw
[root@localhost ~]#sed -nr "/$name/p" /etc/passwd
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
[root@localhost ~]#sed -nr '/'$name'/p' /etc/passwd
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
#弱引用不能识别变量,需要使用强引用或者将变量名也用弱引号标记

image-20240130163652012

5、脚本格式

'地址+命令'组成
1. 不给地址:对全文进行处理(比如行号)
2. 单地址:
   #:#表示数字,指定的行,
   $:表示最后一行
   /pattern/:被此处模式所能够匹配到的每一行,正则表达式
3. 地址范围:
   n,n    #从n行到第n行,(如:2,6 从第2行到第6行)
   n,+n   #从n行到+n行,(如:2,+6 表示从2行到第8行)
   /pat1/,/pat2/  第一个正则表达式和第二个正则表达式之间的行
  (如: n,/pat/ 表示从n号行为开始找到 pat为止; /pat/,n  表示找到n个pat为止) 
4. 步进:~
   1~2 表示奇数行(从1开始,间隔为2)
   2~2 表示偶数行(从2开始,间隔为2)
#打印2至6行
[root@localhost ~]#seq 10|sed -n '2,6p'
2
3
4
5
6

#打印2至8行(2+6)
[root@localhost ~]#seq 10|sed -n '2,+6p'
2
3
4
5
6
7
8
[root@localhost ~]#

#打印奇数行
[root@localhost ~]#seq 10|sed -n '1~2p'
1
3
5
7
9

#打印偶数行
[root@localhost ~]#seq 10|sed -n '2~2p'
2
4
6
8
10

image-20240130170814002

  • 24
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值