当前位置:网站首页>文本三剑客——sed 修改、替换

文本三剑客——sed 修改、替换

2022-08-11 05:32:00 欢喜躲在眉梢里

目录

一、sed是什么?有什么作用?

二、sed执行的原理

三、sed的语法命令格式

1、格式

2、sed的常用选项

3、sed的常用编辑命令

 3.1 sed中的p命令

 3.2、sed的d命令

 3.3 sed的a命令

3.4 sed的s命令

3.5 sed命令中的&

3.6  sed  -r:正则中的转义

3.7 sed的查找

3.8 shell里的变量传递给sed

3.9  sed中标签的用法

四、sed执行的原理

正则的定义:使用一些特殊符号+字母和数字按照某个正确的规则组合成一个公式来表示某个意思这就是正则表达式。

shell编程:Linux里的编程,主要就是使用linux命令+流控,实现自动化的去操作Linux系统。

shell编程的目的就是编写脚本,批量去操作Linux,完成多个任务。

grep:文本过滤

awk:截取、分类统计

sed:修改文件里面的内容。

一、sed是什么?有什么作用?

sed是一种支持正则表达式的非交互式流编辑器(stream editor),脚本修改文本或者文本替换的最佳工具。

sed -stream editor for filtering and transforming text 就是一个文本过滤和转换(替换)的流编辑器。

stream:数据流、文本流。

①替换renxiaojing文件里的luoziyao为luodayou

[[email protected] shell]# sed -i 's/luoziyao/luodayou/' renxiaojing
[[email protected] shell]# echo $?
0
[[email protected] shell]# cat renxiaojing
aomeimie  luodayou
sanchuang feng laoshi
zhang tongtong xuyalan

② 替换操作:

[[email protected] shell]# sed -i '/^SELINUX=/  s/enforcing/disabled/' /etc/selinux/config 

-n ---quiet ,---silent

cat - concatenate files and print on the standard output

concatenate:连接、拼接

③查看renxiaojing文件和etc/passwd文件里面的内容,并写入luo.txt文件里

[[email protected] shell]# cat renxiaojing.txt /etc/passwd >luo.txt
[[email protected] shell]# cat luo.txt
aomeimie  luodayou
sanchuang feng laoshi
zhang tongtong xuyalan
root:x:0:0:root:/root:/bin/bash

sed -i 's/..../..../g' 其中s:表示substitute:替换; g:global

 将renxiaojing文件里面所有的tongtong全部变成jingjing。

[[email protected] shell]# sed -i 's/tongtong/jingjing/g' renxiaojing.txt
[[email protected] shell]# cat renxiaojing.txt
aomeimie  luodayou
sanchuang feng laoshi
zhang jingjing xuyalan
jingjing jingjing jingjing

二、sed执行的原理

sed -i 's/dayou/ziyao/g' renxiaojing.txt

原理图为:

三、sed的语法命令格式

1、格式

sed 【选项】sed编辑命令  输入文件

shell命令 | sed 【选项】sed编辑命令

sed 【选项】-f sed脚本文件 输入文件

2、sed的常用选项

 -n只显示匹配处理的行(否则会输出所有)
-e执行多个编辑命令时(一般用;代替)
-i直接在文件中进行修改,而不是输出到屏幕
-r支持扩展正则表达式
-f从脚本文件中读取内容并执行(文件中的编辑命令每行一个,不用;隔开)

3、sed的常用编辑命令

p打印匹配行 print
d删除指定行 delete
a在匹配行后面追加append
i在匹配行前面插入insert
c整行替换
r将文件的内容读入  read
w将文本写入文件 write
s字符串替换(匹配正则表达式)substitute
=输出行号

 2c表示 替换第二行,-i表示直接在文件中进行修改。

[[email protected] shell]# sed -i '2c cali sanchuang'  renxiaojing.txt
[[email protected] shell]# cat renxiaojing.txt
aomeimie  luoziyao
cali sanchuang
zhang jingjing xuyalan
jingjing jingjing jingjing

 3.1 sed中的p命令

[[email protected] shell]# sed  -n '2,3p' passwd
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin

awk中$0表示整行。

sed中$p表示打印最后一行。

例题:输出第一行和最后一行。

#使用head和tail
[[email protected] shell]# head -1 passwd;tail -1 passwd
root:x:0:0:root:/root:/bin/bash
tanxue1:x:2029:2032::/home/tanxue1:/bin/bash
#使用sed方法
[[email protected] shell]# sed -n '1p;$p' passwd
root:x:0:0:root:/root:/bin/bash
tanxue1:x:2029:2032::/home/tanxue1:/bin/bash
[[email protected] shell]# sed -n '3,+3p' /etc/passwd
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

step:步长值:从1开始往后增加2行。

[[email protected] shell]# cat passwd -n |sed -n '1~2p'
     1	root:x:0:0:root:/root:/bin/bash
     3	daemon:x:2:2:daemon:/sbin:/sbin/nologin
     5	lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
     7	shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
     9	mail:x:8:12:mail:/var/spool/mail:/sbin/nologin

[[email protected] shell]# cat passwd -n |sed -n '2~2p'
     2	bin:x:1:1:bin:/bin:/sbin/nologin
     4	adm:x:3:4:adm:/var/adm:/sbin/nologin
     6	sync:x:5:0:sync:/sbin:/bin/sync

 3.2、sed的d命令

d---delete :删除。

删除以"#"开头或者没有什么开头和结尾的内容。

[[email protected] shell]#sed -n  -r '/^#|^$/d' /etc/ssh/sshd_config

 查找df -h中以“/”的那行。

[[email protected] shell]# df -h|egrep "/$"
/dev/mapper/centos-root   17G  7.0G   11G   42% /
[[email protected] shell]# df -h|sed -n '/\/$/p'
/dev/mapper/centos-root   17G  7.0G   11G   42% /
[[email protected] shell]# df -h|sed -n '/^[a-Z]/p'
devtmpfs                 475M     0  475M    0% /dev
[[email protected] shell]# df -h|sed -n '/^[0-9]/p'
[[email protected] shell]# df -h|sed -n '/^[0-9]/!p'
文件系统                 容量  已用  可用 已用% 挂载点
/dev/mapper/centos-root   17G  7.0G   11G   42% /
devtmpfs                 475M     0  475M    0% /dev
........

 3.3 sed的a命令

-i:表示在 文件中进行操作,不输出到屏幕中。

2i:表示在匹配的第二行前面加入内容。

例如:在renxiaojing.txt文件的第二行插入zoupeng。

[[email protected] shell]# sed -i '2i zoupeng' renxiaojing.txt  #在第二行插入zoupeng
[[email protected] shell]# cat renxiaojing.txt
aomeimie  luoziyao
zoupeng
cali sanchuang
tanxue
zhang jingjing xuyalan
jingjing jingjing jingjing

[[email protected] shell]# sed -i '/tanxue/i wangshuai' renxiaojing.txt   #在tianxue前面插入wangshuai
[[email protected] shell]# cat renxiaojing.txt
aomeimie  luoziyao
zoupeng
cali sanchuang
wangshuai
tanxue
zhang jingjing xuyalan
jingjing jingjing jingjing

a:表示追加操作,在匹配的行后面进行追加。

例如:在renxiaojing.txt文件的第二行追加tanxue。

[[email protected] shell]# sed -i '2a tanxue' renxiaojing.txt  #在第二行追加tanxue
[[email protected] shell]# cat renxiaojing.txt
aomeimie  luoziyao
zoupeng
tanxue
cali sanchuang
wangshuai
tanxue
zhang jingjing xuyalan
jingjing jingjing jingjing

 修改Linux系统里的主机名:

将/etc/hostname文件里的名字修改为:dengjianguo

sed -i '1c dengjianguo' hostname

修改主机名:

hostnamectl set-hostname sc   #将主机名改为sc。

^:表示行号

$:表示行尾

3.4 sed的s命令

默认替换第一个。

[[email protected] shell]# cat renxiaojing.txt
aomeimie  luoziyao
zoupeng
cali sanchuang
wangshuai
tanxue
zhang jingjing xuyalan
jingjing jingjing jingjing
[[email protected] shell]# sed -i '/^zhang/ s/jingjing/pengpeng/' renxiaojing.txt    #默认替换第一个
aomeimie  luoziyao
zoupeng
tanxue
cali sanchuang
wangshuai
tanxue
zhang pengpeng xuyalan
jingjing jingjing jingjing

[[email protected] shell]# sed -i '/^zhang/ s/jingjing/pengpeng/3' renxiaojing.txt   #指定替换
[[email protected] shell]# cat renxiaojing.txt
aomeimie  luoziyao
zoupeng
tanxue
cali sanchuang
wangshuai
tanxue
zhang pengpeng jingjing jingjing pengpeng  xuyalan
jingjing jingjing jingjing

[email protected] shell]# sed -i '/^zhang/ s/jingjing/pengpeng/g' renxiaojing.txt   #全部替换
[[email protected] shell]# cat renxiaojing.txt
aomeimie  luoziyao
zoupeng
tanxue
cali sanchuang
wangshuai
tanxue
zhang pengpeng pengpeng pengpeng pengpeng  xuyalan


[[email protected] shell]# sed -i 's/:/\n/g' passwd

[[email protected] shell]# sed -i 's/^/sanchuang/' hosts
[[email protected] shell]# cat hosts
sanchuang127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain6
sanchuang::1         localhost localhost.localdomain localhost6 localhost6.localdomain6

n

输出模式空间行,读取下一行替换当前模式空间的行,执行下一条命令而非第一条命令
N读取下一行,追加到模式空间行后面,此时模式空间有两行。
h把模式空间里的行拷贝到暂存空间。
H把模式空间里的行追加到暂存空间。

g

把暂存空间的内容替换模式空间的行。
G把暂存空间的内容追加到模式空间的行后。
x把暂存空间的内容于模式空间里的当前行互换。
对所选行以外的所有行应用命令。---》对行号进行取反。
2!G不是第二行的时候进行G操作。
$!d不是最后一行的时候进行d操作,是最后一行的时候就不进行d操作。

 行号是sed读取的文件里的第几行。

n N:Read/append the next line of input the pattern space.

NN是将两个都加入到模式空间。

[[email protected] shell]# sed -i 'N;N;s/\n/:80,/g;s/$/:80/' test.txt
[[email protected] shell]# cat test.txt
0.0.0.0:80,1.1.1.1:80,2.2.2.2

 xargs:将多行变成单行。将前面的标准输出通过管道进行标准输入得到的内容分割成一个一个的参数,使用空格隔开。

[[email protected] shell]# cat test.txt.bak|xargs
0.0.0.0 1.1.1.1 2.2.2.2
[[email protected] shell]# cat test.txt.bak|xargs|awk '{print $1":80,"$2":80,",$3":80"}'
0.0.0.0:80,1.1.1.1:80, 2.2.2.2:80

3.5 sed命令中的&

&表示替换命令中的匹配模式,代表匹配到的内容,然后可以引用。

[[email protected] shell]# echo "i have a fat cat"
i have a fat cat
[[email protected] shell]# echo "i have a fat cat"|sed 's/.at/".at"/g'
i have a ".at" ".at"
[[email protected] shell]# echo "i have a fat cat"|sed 's/.at/"&"/g'
i have a "fat" "cat"

[[email protected] shell]# cat renxiaojing.txt
........
tanxue
zhang shuaishuai 123
zhang  456 pengpeng pengpeng pengpeng pengpeng  xuyalan
jingjing jingjing jingjing
[[email protected] shell]# sed -i -r 's/\<[0-9]{3}\>/&0/g' renxiaojing.txt
[[email protected] shell]# cat renxiaojing.txt
.....
tanxue
zhang shuaishuai 1230
zhang  4560 pengpeng pengpeng pengpeng pengpeng  xuyalan
jingjing jingjing jingjing

3.6  sed  -r:正则中的转义

[[email protected] shell]# sed -n -r 's/[A-Z]/&2022/gp' test1.txt
abcH2022H2022H2022H2022dddde
abF2022K2022D2022dddde
isO2022O2022O2022ishabxil
H2022E2022P2022R2022E2022doodcm

 \ \:转义字符

[[email protected] shell]# sed -n '/13\/Jul\/2022:16:53:58/,/13\/Jul\/2022:16:56:21/p' access.log
sed -n 
localhost shell]# sed -n '#13/Jul\/2022:16:53:58#,#13/Jul/2022:16:56:21#p' access.log

修改时间:date -s "修改的时间"。 

3.7 sed的查找

①根据行号

②根据模式 ---正则

-r:扩展正则

p:表示打印

③以‘#’开头或者没有什么开头和结尾的内容,并打印出来。

[[email protected] shell]#sed -n  -r '/^#|^$/p' /etc/ssh/sshd_config

 ④ 不打印以‘#’开头或者没有什么开头和结尾的内容。

[[email protected] shell]#sed -n  -r '/^#|^$/!p' /etc/ssh/sshd_config

3.8 shell里的变量传递给sed

sed -传参问题-使用变量,然后应用引用变量接{}:花括号。

[[email protected] shell]# a=5
[[email protected] shell]# b=10
[[email protected] shell]# sed -n '$ap;$bp' /etc/passwd
p;$bp
[[email protected] shell]# sed -n "${a}p;${b}p" /etc/passwd
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
[[email protected] shell]# echo $a
5
[[email protected] shell]# echo $b
10
[[email protected] shell]# sg="wangzixiang"
[[email protected] shell]# echo $sg
wangzixiang
[[email protected] shell]# echo ${sg}1
wangzixiang1
[[email protected] shell]# useradd wangzixiang
[[email protected] shell]# sg=wangzixiang
[[email protected] shell]# sed -n "/${sg}/p" /etc/passwd
wangzixiang:x:2030:2033::/home/wangzixiang:/bin/bash

3.9  sed中标签的用法

sed中使用圆括号定义替换模式中的部分字符。

标签可以方便在后面引用,每行指令最多使用9个标签。

小圆括号里面匹配的就是一个标签,后面再替换的时候可以引用,第一个小圆括号里的是\1,以此类推。

[[email protected] shell]# echo aaa bbb ccc |sed -r 's/([a-z]+) ([a-z]+) ([a-z]+)/\3 \2 \1/'
ccc bbb aaa
[[email protected] shell]# echo aaa bbb ccc |sed -r 's/([a-z]+) ([a-z]+) ([a-z]+)/\3/'
ccc
[[email protected] shell]# echo aaa bbb ccc |awk '{print $3,$2,$1}'
ccc bbb aaa
方法一:
[[email protected] shell]# tac test.txt.bak
2.2.2.2
1.1.1.1
0.0.0.0
方法二:
[[email protected] shell]# cat test.txt.bak|xargs|awk '{print $3"\n"$2"\n"$1}'
2.2.2.2
1.1.1.1
0.0.0.0

四、sed执行的原理

原网站

版权声明
本文为[欢喜躲在眉梢里]所创,转载请带上原文链接,感谢
https://blog.csdn.net/m0_52165864/article/details/126088308