当前位置:   article > 正文

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

sed替换

目录

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

  1. [root@localhost shell]# sed -i 's/luoziyao/luodayou/' renxiaojing
  2. [root@localhost shell]# echo $?
  3. 0
  4. [root@localhost shell]# cat renxiaojing
  5. aomeimie luodayou
  6. sanchuang feng laoshi
  7. 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文件里

  1. [root@localhost shell]# cat renxiaojing.txt /etc/passwd >luo.txt
  2. [root@localhost shell]# cat luo.txt
  3. aomeimie luodayou
  4. sanchuang feng laoshi
  5. zhang tongtong xuyalan
  6. root:x:0:0:root:/root:/bin/bash

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

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

  1. [root@localhost shell]# sed -i 's/tongtong/jingjing/g' renxiaojing.txt
  2. [root@localhost shell]# cat renxiaojing.txt
  3. aomeimie luodayou
  4. sanchuang feng laoshi
  5. zhang jingjing xuyalan
  6. 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表示直接在文件中进行修改。

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

 3.1 sed中的p命令

  1. [root@localhost shell]# sed -n '2,3p' passwd
  2. bin:x:1:1:bin:/bin:/sbin/nologin
  3. daemon:x:2:2:daemon:/sbin:/sbin/nologin

awk中$0表示整行。

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

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

  1. #使用head和tail
  2. [root@localhost shell]# head -1 passwd;tail -1 passwd
  3. root:x:0:0:root:/root:/bin/bash
  4. tanxue1:x:2029:2032::/home/tanxue1:/bin/bash
  5. #使用sed方法
  6. [root@localhost shell]# sed -n '1p;$p' passwd
  7. root:x:0:0:root:/root:/bin/bash
  8. tanxue1:x:2029:2032::/home/tanxue1:/bin/bash
  1. [root@localhost shell]# sed -n '3,+3p' /etc/passwd
  2. daemon:x:2:2:daemon:/sbin:/sbin/nologin
  3. adm:x:3:4:adm:/var/adm:/sbin/nologin
  4. lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
  5. sync:x:5:0:sync:/sbin:/bin/sync

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

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

 3.2、sed的d命令

d---delete :删除。

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

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

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

  1. [root@localhost shell]# df -h|egrep "/$"
  2. /dev/mapper/centos-root 17G 7.0G 11G 42% /
  3. [root@localhost shell]# df -h|sed -n '/\/$/p'
  4. /dev/mapper/centos-root 17G 7.0G 11G 42% /
  5. [root@localhost shell]# df -h|sed -n '/^[a-Z]/p'
  6. devtmpfs 475M 0 475M 0% /dev
  7. [root@localhost shell]# df -h|sed -n '/^[0-9]/p'
  8. [root@localhost shell]# df -h|sed -n '/^[0-9]/!p'
  9. 文件系统 容量 已用 可用 已用% 挂载点
  10. /dev/mapper/centos-root 17G 7.0G 11G 42% /
  11. devtmpfs 475M 0 475M 0% /dev
  12. ........

 3.3 sed的a命令

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

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

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

  1. [root@localhost shell]# sed -i '2i zoupeng' renxiaojing.txt #在第二行插入zoupeng
  2. [root@localhost shell]# cat renxiaojing.txt
  3. aomeimie luoziyao
  4. zoupeng
  5. cali sanchuang
  6. tanxue
  7. zhang jingjing xuyalan
  8. jingjing jingjing jingjing
  9. [root@localhost shell]# sed -i '/tanxue/i wangshuai' renxiaojing.txt #在tianxue前面插入wangshuai
  10. [root@localhost shell]# cat renxiaojing.txt
  11. aomeimie luoziyao
  12. zoupeng
  13. cali sanchuang
  14. wangshuai
  15. tanxue
  16. zhang jingjing xuyalan
  17. jingjing jingjing jingjing

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

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

  1. [root@localhost shell]# sed -i '2a tanxue' renxiaojing.txt #在第二行追加tanxue
  2. [root@localhost shell]# cat renxiaojing.txt
  3. aomeimie luoziyao
  4. zoupeng
  5. tanxue
  6. cali sanchuang
  7. wangshuai
  8. tanxue
  9. zhang jingjing xuyalan
  10. jingjing jingjing jingjing

 修改Linux系统里的主机名:

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

sed -i '1c dengjianguo' hostname

修改主机名:

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

^:表示行号

$:表示行尾

3.4 sed的s命令

默认替换第一个。

  1. [root@localhost shell]# cat renxiaojing.txt
  2. aomeimie luoziyao
  3. zoupeng
  4. cali sanchuang
  5. wangshuai
  6. tanxue
  7. zhang jingjing xuyalan
  8. jingjing jingjing jingjing
  9. [root@localhost shell]# sed -i '/^zhang/ s/jingjing/pengpeng/' renxiaojing.txt #默认替换第一个
  10. aomeimie luoziyao
  11. zoupeng
  12. tanxue
  13. cali sanchuang
  14. wangshuai
  15. tanxue
  16. zhang pengpeng xuyalan
  17. jingjing jingjing jingjing
  18. [root@localhost shell]# sed -i '/^zhang/ s/jingjing/pengpeng/3' renxiaojing.txt #指定替换
  19. [root@localhost shell]# cat renxiaojing.txt
  20. aomeimie luoziyao
  21. zoupeng
  22. tanxue
  23. cali sanchuang
  24. wangshuai
  25. tanxue
  26. zhang pengpeng jingjing jingjing pengpeng xuyalan
  27. jingjing jingjing jingjing
  28. root@localhost shell]# sed -i '/^zhang/ s/jingjing/pengpeng/g' renxiaojing.txt #全部替换
  29. [root@localhost shell]# cat renxiaojing.txt
  30. aomeimie luoziyao
  31. zoupeng
  32. tanxue
  33. cali sanchuang
  34. wangshuai
  35. tanxue
  36. zhang pengpeng pengpeng pengpeng pengpeng xuyalan
  37. [root@localhost shell]# sed -i 's/:/\n/g' passwd
  38. [root@localhost shell]# sed -i 's/^/sanchuang/' hosts
  39. [root@localhost shell]# cat hosts
  40. sanchuang127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain6
  41. 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是将两个都加入到模式空间。

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

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

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

3.5 sed命令中的&

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

  1. [root@localhost shell]# echo "i have a fat cat"
  2. i have a fat cat
  3. [root@localhost shell]# echo "i have a fat cat"|sed 's/.at/".at"/g'
  4. i have a ".at" ".at"
  5. [root@localhost shell]# echo "i have a fat cat"|sed 's/.at/"&"/g'
  6. i have a "fat" "cat"
  7. [root@localhost shell]# cat renxiaojing.txt
  8. ........
  9. tanxue
  10. zhang shuaishuai 123
  11. zhang 456 pengpeng pengpeng pengpeng pengpeng xuyalan
  12. jingjing jingjing jingjing
  13. [root@localhost shell]# sed -i -r 's/\<[0-9]{3}\>/&0/g' renxiaojing.txt
  14. [root@localhost shell]# cat renxiaojing.txt
  15. .....
  16. tanxue
  17. zhang shuaishuai 1230
  18. zhang 4560 pengpeng pengpeng pengpeng pengpeng xuyalan
  19. jingjing jingjing jingjing

3.6  sed  -r:正则中的转义

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

 \ \:转义字符

  1. [root@localhost shell]# sed -n '/13\/Jul\/2022:16:53:58/,/13\/Jul\/2022:16:56:21/p' access.log
  2. sed -n
  3. 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:表示打印

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

[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 -传参问题-使用变量,然后应用引用变量接{}:花括号。

  1. [root@localhost shell]# a=5
  2. [root@localhost shell]# b=10
  3. [root@localhost shell]# sed -n '$ap;$bp' /etc/passwd
  4. p;$bp
  5. [root@localhost shell]# sed -n "${a}p;${b}p" /etc/passwd
  6. lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
  7. operator:x:11:0:operator:/root:/sbin/nologin
  8. [root@localhost shell]# echo $a
  9. 5
  10. [root@localhost shell]# echo $b
  11. 10
  12. [root@localhost shell]# sg="wangzixiang"
  13. [root@localhost shell]# echo $sg
  14. wangzixiang
  15. [root@localhost shell]# echo ${sg}1
  16. wangzixiang1
  17. [root@localhost shell]# useradd wangzixiang
  18. [root@localhost shell]# sg=wangzixiang
  19. [root@localhost shell]# sed -n "/${sg}/p" /etc/passwd
  20. wangzixiang:x:2030:2033::/home/wangzixiang:/bin/bash

3.9  sed中标签的用法

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

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

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

  1. [root@localhost shell]# echo aaa bbb ccc |sed -r 's/([a-z]+) ([a-z]+) ([a-z]+)/\3 \2 \1/'
  2. ccc bbb aaa
  3. [root@localhost shell]# echo aaa bbb ccc |sed -r 's/([a-z]+) ([a-z]+) ([a-z]+)/\3/'
  4. ccc
  5. [root@localhost shell]# echo aaa bbb ccc |awk '{print $3,$2,$1}'
  6. ccc bbb aaa
  7. 方法一:
  8. [root@localhost shell]# tac test.txt.bak
  9. 2.2.2.2
  10. 1.1.1.1
  11. 0.0.0.0
  12. 方法二:
  13. [root@localhost shell]# cat test.txt.bak|xargs|awk '{print $3"\n"$2"\n"$1}'
  14. 2.2.2.2
  15. 1.1.1.1
  16. 0.0.0.0

四、sed执行的原理

本文内容由网友自发贡献,转载请注明出处:https://www.wpsshop.cn/w/凡人多烦事01/article/detail/264956
推荐阅读
相关标签
  

闽ICP备14008679号