sed是一个流编辑器, 非交互式的编辑器,它一次处理一行内容. 处理时,把当前处理的行存储在临时缓冲区中,称*
为“模式空间”(pattern space) 接着用 sed 命令处理缓冲区中的内容,处理完成后, 把缓冲区的内容送往屏幕。 接
着处理下一行,这样不断重复,直到文件末尾。 文件内容并没有改变,除非你 使用重定向存储输出。 Sed 要用来自
动编辑一个或多个文件;简化对文件的反复操作;编写转换程序等。
第一种形式:stdout | sed [option] "pattern command"
第二种形式: sed [option] "pattern command" file
sed相关示例文件
[root@web01 opt]# cat file.txt
I love shell
I love SHELL
This is test file
?
#取消默认输出
[root@web01 opt]# sed -n '/shell/p' file.txt
I love shell
[root@web01 opt]# sed -n -e '/shell/p' -e '/SHELL/p' file.txt
I love shell
I love SHELL
#将pattern写入文件中
[root@web01 opt]# cat edit.sed
/shell/p
[root@web01 opt]# sed -n -f edit.sed file.txt
[root@web01 opt]# sed -n '/shell|SHELL/p' file.txt
#扩展正则表达式
[root@web01 opt]# sed -rn '/shell|SHELL/p' file.txt
I love shell
I love SHELL
[root@manager sed]# sed -in '/shell/d' file.txt
sed -n '10p' passwd
sed -n '10,20p' passwd
sed -n '1,+5p' passwd
sed -n '/^root/p' passwd
sed -n '/^root/,/^ftp/p' passwd
sed -n '/^\[mysql.*/,/^\[mysqld_safe\]/p' /etc/my.cnf|grep -v "^\[.*"
sed -n '2,/\/bin\/sync/p' passwd
sed -n '20p' /etc/passwd
sed -n '8,15p' /etc/passwd
sed -n '8,+5p' /etc/passwd
sed -n '/^bin/p' /etc/passwd
sed -n '/^root/,/^ftp/p' /etc/passwd
sed -n '8,/\/sbin\/nologin/p' /etc/passwd
[root@manager sed]# sed -i '/^root/i server {\n\tlisten 80;\n\tserver_name oldxu.com;\n\tindex index.html;\n\troot /code;\n}' passwd
server {
listen 80;
server_name oldxu.com;
index index.html;
root /code;
}
sed -i '10a "Add Line"' passwd
sed -i '10,20a "Test Line"' passwd
sed -i '/\/bin\/bash/a "Insert Line"' passwd
sed -i '/^bin/i "Add Line Before"' passwd
sed -i 'i "Insert Line Before"' passwd
sed -i '10r /etc/fstab' passwd
sed -i '/\/bin\/sync/r /etc/inittab' passwd
sed -i '10r /etc/hosts' passwd
sed -i '/\/bin\/bash/w /tmp/sed.txt' passwd
sed -i '10,/^nfsnobody/w /tmp/sed-1.txt' passwd
sed -i '15d' passwd
sed -i '8,14d' passwd
sed -i '/\/sbin\/nologin$/d' passwd
sed -i '/^bin/,/^ntp/d' passwd
sed '3,/^ftp/d' passwd
sed -ri '/^#|^$| #/d' nginx.conf
sed '/^SELINUX=/c SELINUX=disabled'
sed -i '1s/root/ROOT/' passwd
sed -i '5,10s/\/sbin\/nologin/\/bin\/bash/' passwd
? sed -i '5,10s#/sbin/nologin#/bin/bash#' passwd
sed -i '/\/sbin\/nologin/s#login#LOGIN#g' passwd
sed -i '/\/sbin\/nologin/s/login/LOGIN#g' passwd
sed -i '/^root/,/^bin/s/bin/BIN/g' passwd
sed -i '/^SELINUX=/c SELINUX=disabled' selinux
sed -i 's/^/# /' nginx.conf
ifconfig eth0 | sed -rn '2s/^.*et //p' | sed -rn 's/ ne.*//p'
ifconfig eth0 |sed -nr '2s/(^.*et) (.*) (net.*)/\2/p'
? 1.输文件中有几个段,一对 [ ] 为一段。
? 2.针对每个段配置文件参数,统计总个数。
?
[root@web01 opt]# sh example.sh
1: client 2
2: server 12
3: mysqld 12
4: mysqld_safe 7
5: embedded 8
6: mysqld-5.5 10
sed -n -e '/^\[.*\]/p' sed.txt | sed 's/\[//' | sed 's/\]//'
sed -n '/^\[server\]/,/^\[.*\]/p' sed.txt | sed -r '/^\[|^#|^$/d'|wc -l
[root@web01 sed]# cat sed.sh
#!/bin/bash
#Author: rzq
#QQ: 0123456789
#Date: 2019-11-06
#FileName: sed.sh
#URL: https://www.jianshu.com
#Description: The test script
#Copyright (C): 2019 All rights reserved
HS () {
num=$(sed -n '/^\[.*]/p' kl.txt|sed 's/\[//'|sed 's/\]//')
}
GS () {
gs=$(sed -n '/^\['$i']/,/^\[.*]/p' kl.txt|sed -r '/^\[|^#|^$/d'|wc -l)
}
HS
b=0
for i in $num
do
let b++
GS
echo "$b $i $gs"
done
需求描述: 处理一个ansible的invtory主机清单。
? 1.输出主机组,一对 [ ] 为一个主机组。
? 2.输出每个主机组下的主机总个数。
[root@web01 opt]# sh example.sh
1: web01: 有 2 台主机
2: web02: 有 12 台主机
[root@web01 sed]# cat ansible.sh
#!/bin/bash
#Author: rzq
#QQ: 0123456789
#Date: 2019-11-07
#FileName: ansible.sh
#URL: https://www.jianshu.com
#Description: The test script
#Copyright (C): 2019 All rights reserved
fu () {
FW=$(sed -n '/^\[.*]/p' lp.txt|sed 's/\[//' | sed 's/\]//')
}
ip () {
IP=$(sed -n '/^\['$i'/,/^\[.*]/p' lp.txt|sed -r '/^\[|^$/d'|wc -l)
}
fu
num=0
for i in $FW
do
let num++
ip
echo "$num $i $IP"
done
sed
两种语法:
sed options '/pattern1/command' file
1、选项options:
-i 直接变更文件
-r 支持扩展正则表达式
-f 将处理命令写入文件中,然后进行调用
-e 可以多项编辑操作
-n 取消默认文本的输出
2.模式匹配
字符串匹配
正则表达式匹配
从哪里-> 到哪里 '/pattern1/,/pattern2/'
3.命令command
增
a #在匹配的行后添加
i #在匹配的行前添加
r #读取某个文件的内容,添加至/pattern1/行的后面
w #将文件的内容写入到某个文件中。 >
删
d #对匹配的内容进行删除,但需要配合-i选项才能操作文件。
改
s/// #替换,将什么替换成什么,需要配合-i选项才能操作文件
s///g #替换,全局替换(替换一个行中所有满足条件的内容)
c #修改,可以使用正则表达式匹配,然后修改 需要配合-i选项才能操作文件
查
p #打印输出的效果。默认的动作,必须要添加。通常配合-n一起使用
原文:https://www.cnblogs.com/baozexu/p/11809166.html