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

文本三剑客——sed 修改、替换sed 是一种支持正则表达式的非交互式流编辑器 streameditor 脚本修改文本或者文本替换的最佳工具

大家好,欢迎来到IT知识分享网。

目录

一、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

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

② 替换操作:

[root@localhost 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文件里

[root@localhost shell]# cat renxiaojing.txt /etc/passwd >luo.txt [root@localhost 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。

[root@localhost shell]# sed -i 's/tongtong/jingjing/g' renxiaojing.txt [root@localhost 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 修改、替换

三、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表示直接在文件中进行修改。

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

 3.1 sed中的p命令

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

[root@localhost 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 [root@localhost shell]# head -1 passwd;tail -1 passwd root:x:0:0:root:/root:/bin/bash tanxue1:x:2029:2032::/home/tanxue1:/bin/bash #使用sed方法 [root@localhost shell]# sed -n '1p;$p' passwd root:x:0:0:root:/root:/bin/bash tanxue1:x:2029:2032::/home/tanxue1:/bin/bash
[root@localhost 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行。

[root@localhost 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 [root@localhost 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 :删除。

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

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

[root@localhost shell]#sed -n -r '/^#|^$/d' /etc/ssh/sshd_config

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

[root@localhost shell]# df -h|egrep "/$" /dev/mapper/centos-root 17G 7.0G 11G 42% / [root@localhost shell]# df -h|sed -n '/\/$/p' /dev/mapper/centos-root 17G 7.0G 11G 42% / [root@localhost shell]# df -h|sed -n '/^[a-Z]/p' devtmpfs 475M 0 475M 0% /dev [root@localhost shell]# df -h|sed -n '/^[0-9]/p' [root@localhost 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命令

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

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

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

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

[root@localhost shell]# sed -i '2i zoupeng' renxiaojing.txt #在第二行插入zoupeng [root@localhost shell]# cat renxiaojing.txt aomeimie luoziyao zoupeng cali sanchuang tanxue zhang jingjing xuyalan jingjing jingjing jingjing [root@localhost shell]# sed -i '/tanxue/i wangshuai' renxiaojing.txt #在tianxue前面插入wangshuai [root@localhost shell]# cat renxiaojing.txt aomeimie luoziyao zoupeng cali sanchuang wangshuai tanxue zhang jingjing xuyalan jingjing jingjing jingjing

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

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

[root@localhost shell]# sed -i '2a tanxue' renxiaojing.txt #在第二行追加tanxue [root@localhost 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命令

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

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

默认替换第一个。

[root@localhost shell]# cat renxiaojing.txt aomeimie luoziyao zoupeng cali sanchuang wangshuai tanxue zhang jingjing xuyalan jingjing jingjing jingjing [root@localhost shell]# sed -i '/^zhang/ s/jingjing/pengpeng/' renxiaojing.txt #默认替换第一个 aomeimie luoziyao zoupeng tanxue cali sanchuang wangshuai tanxue zhang pengpeng xuyalan jingjing jingjing jingjing [root@localhost shell]# sed -i '/^zhang/ s/jingjing/pengpeng/3' renxiaojing.txt #指定替换 [root@localhost shell]# cat renxiaojing.txt aomeimie luoziyao zoupeng tanxue cali sanchuang wangshuai tanxue zhang pengpeng jingjing jingjing pengpeng xuyalan jingjing jingjing jingjing root@localhost shell]# sed -i '/^zhang/ s/jingjing/pengpeng/g' renxiaojing.txt #全部替换 [root@localhost shell]# cat renxiaojing.txt aomeimie luoziyao zoupeng tanxue cali sanchuang wangshuai tanxue zhang pengpeng pengpeng pengpeng pengpeng xuyalan [root@localhost shell]# sed -i 's/:/\n/g' passwd [root@localhost shell]# sed -i 's/^/sanchuang/' hosts [root@localhost 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是将两个都加入到模式空间。

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

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

[root@localhost shell]# cat test.txt.bak|xargs 0.0.0.0 1.1.1.1 2.2.2.2 [root@localhost 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命令中的&

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

[root@localhost shell]# echo "i have a fat cat" i have a fat cat [root@localhost shell]# echo "i have a fat cat"|sed 's/.at/".at"/g' i have a ".at" ".at" [root@localhost shell]# echo "i have a fat cat"|sed 's/.at/"&"/g' i have a "fat" "cat" [root@localhost shell]# cat renxiaojing.txt ........ tanxue zhang shuaishuai 123 zhang 456 pengpeng pengpeng pengpeng pengpeng xuyalan jingjing jingjing jingjing [root@localhost shell]# sed -i -r 's/\<[0-9]{3}\>/&0/g' renxiaojing.txt [root@localhost shell]# cat renxiaojing.txt ..... tanxue zhang shuaishuai 1230 zhang 4560 pengpeng pengpeng pengpeng pengpeng xuyalan jingjing jingjing jingjing

3.6  sed  -r:正则中的转义

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

 \ \:转义字符

[root@localhost 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 “修改的时间”。 

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

3.7 sed的查找

①根据行号

②根据模式 —正则

-r:扩展正则

p:表示打印

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

[root@localhost shell]#sed -n -r '/^#|^$/p' /etc/ssh/sshd_config

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

[root@localhost shell]#sed -n -r '/^#|^$/!p' /etc/ssh/sshd_config

3.8 shell里的变量传递给sed

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

[root@localhost shell]# a=5 [root@localhost shell]# b=10 [root@localhost shell]# sed -n '$ap;$bp' /etc/passwd p;$bp [root@localhost 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 [root@localhost shell]# echo $a 5 [root@localhost shell]# echo $b 10 [root@localhost shell]# sg="wangzixiang" [root@localhost shell]# echo $sg wangzixiang [root@localhost shell]# echo ${sg}1 wangzixiang1 [root@localhost shell]# useradd wangzixiang [root@localhost shell]# sg=wangzixiang [root@localhost shell]# sed -n "/${sg}/p" /etc/passwd wangzixiang:x:2030:2033::/home/wangzixiang:/bin/bash

3.9  sed中标签的用法

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

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

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

[root@localhost shell]# echo aaa bbb ccc |sed -r 's/([a-z]+) ([a-z]+) ([a-z]+)/\3 \2 \1/' ccc bbb aaa [root@localhost shell]# echo aaa bbb ccc |sed -r 's/([a-z]+) ([a-z]+) ([a-z]+)/\3/' ccc [root@localhost shell]# echo aaa bbb ccc |awk '{print $3,$2,$1}' ccc bbb aaa 方法一: [root@localhost shell]# tac test.txt.bak 2.2.2.2 1.1.1.1 0.0.0.0 方法二: [root@localhost 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执行的原理

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

免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://haidsoft.com/146220.html

(0)
上一篇 2025-04-16 14:26
下一篇 2025-04-16 14:45

相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注微信