加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > Linux > 正文

linux sed 命令 实现对文件的增删改替换查 实验

发布时间:2020-12-14 00:45:25 所属栏目:Linux 来源:网络整理
导读:? ? ? 1. 统一实验文本 # 创建包含下面内容的文件,后面的操作都会使用这个文件 [[email?protected] ~]# cat person.txt 101 ,mike,CEO 102 ,jack,CTO 103 ,yy,CFO 104 ,feixue,CIO 105 ,tom,COO ? 2. 增删改查 2.1 增 a 追加文本到 指定行后 i 插入文本到

?

?

?

1. 统一实验文本

# 创建包含下面内容的文件,后面的操作都会使用这个文件

[[email?protected] ~]# cat person.txt 
101,mike,CEO
102,jack,CTO
103,yy,CFO
104,feixue,CIO
105,tom,COO

?

2. 增删改查

2.1 增

  • a 追加文本到指定行后
  • i 插入文本到指定行前

?

2a 追加到第二行后面

[[email?protected] ~]# sed 2a 106,ben,CSO person.txt 
101,CTO
106,CSO
103,COO

?

2i 把内容 插入到第二行前面

[[email?protected] ~]# sed 2i 106,CEO
106,CSO
102,COO
2.1.2 多行增加

n 换行符 不加n的话 都在一行显示

[[email?protected] ~]# sed 2a 106,CSOn107,peter,CCO person.txt 
101,CSO
107,CCO
103,COO

第二种方法:

后面加 接上输入文本内容

[[email?protected] ~]# sed 2a 106,CSO 
> 107,CCO person.txt
101,CSO 
107,COO

?

企业案例1:优化SSH配置(一键完成增加若干参数)

在我们学习系统优化时,有一个优化点:更改ssh服务远程登录的配置。主要的操作是在ssh的配置文件加入下面5行文本

Port 52113
PermitRootLogin no
PermitEmptyPasswords no
UseDNS no
GSSAPIAuthentication no

我们可以使用vi命令编辑这个文本,但这样就比较麻烦,现在想一条命令增加5行文本到第13行前?

[[email?protected] ~]# sed  13i Port 52113nPermitRootLogin nonPermitEmptyPasswords nonUseDNS nonGSSAPIAuthentication no /etc/ssh/sshd_config 

2.2 删

d 删除指定的行

?

不指定行,就删除所有行,所以没有结果

[[email?protected] ~]# sed d person.txt

?

删除文本第二行

[[email?protected] ~]# sed 2d person.txt 
101,CEO
103,COO

?

把文本 第二行到第5行内容删掉

[[email?protected] ~]# sed 2,5d person.txt 
101,CEO

?

?

把文本的 第二行以上到结尾的行都删掉

[[email?protected] ~]# sed 2,$d person.txt 
101,CEO

?

?

删除文本第二行,第三行

[[email?protected] ~]# sed 2,3d person.txt 
101,CEO
104,COO

?

删除文本奇数行,留下偶数行

[[email?protected] ~]# sed 1~2d person.txt 
102,CTO
104,CIO

?

把文本 第二行到? 2+2=4 第四行删掉? 2-4 删掉

[[email?protected] ~]# sed 2,+2d person.txt 
101,CEO
105,COO

?

匹配有jack字符串那行 删除掉

[[email?protected] ~]# sed /jack/d person.txt 
101,COO

?

匹配有jack字符串和yy字符串的行 删除掉

[[email?protected] ~]# sed /jack/,/yy/d person.txt 
101,COO

?

把有jack字符串的行,和第三行删掉

[[email?protected] ~]# sed /jack/,COO

?

?改

2.3.1 按行替换

c 用新行取代旧行

2c 把输入的文本 替换第二行文本

[[email?protected] ~]# sed 2c 106,benson,CEO
106,COO

?

?

文本替换

s:单独使用→将每一行中第一处匹配的字符串进行替换 ==>sed命令?
g:每一行进行全部替换 ==>sed命令s的替换标志之一,非sed命令?
-i:修改文件内容 ==>sed软件的选项

?

sed软件替换模型(方框▇被替换成三角▲)

sed -i ‘s/▇/▲/g‘ test.log?
sed -i ‘s#▇#▲#g‘ test.log

?

s要和g配合使用

观察特点

  1. 两边是引号,引号里面的两边分别为sg,中间是三个一样的字符/#作为定界符。#能在替换内容包含/有助于区别。定界符可以是任意符号如:|等,但当替换内容包含定界符时,需转义即:?|。经过长期实践,建议大家使用#作为定界符。
  2. 定界符#,第一个和第二个之间的就是被替换的内容,第二个和第三个之间的就是替换后的内容。
  3. s#▇#▲#g,▇能用正则表达式,但▲不能用,必须是具体的。
  4. 默认sed软件是对模式空间(内存中的数据)操作,而-i选项会更改磁盘上的文件内容。

?

[[email?protected] ~]# sed s/jack/ben/g person.txt 
101,ben,COO

?

-i 修改文件内容

[[email?protected] ~]# sed -i s/jack/ben/g person.txt 
[[email?protected] ~]# cat person.txt 
101,COO
企业案例3:指定行修改配置文件

指定行精确修改配置文件,这样可以防止修改多了地方

[[email?protected] ~]# sed 3s#0#9# person.txt 
101,CTO
193,COO
变量替换

再新建一个文本

[[email?protected] ~]# cat test.txt 
a
b
a

赋值

[[email?protected] ~]# x=a
[[email?protected] ~]# y=b
[[email?protected] ~]# echo $x $y
a b

把文本里所有a字符串替换成b

没有引号,用的就是双引号

[[email?protected] ~]# sed s#$x#$y#g test.txt 
b
b
b

单引号,没有变量置换功能,所见所得,是什么输出什么

[[email?protected] ~]# sed s#$x#$y#g test.txt 
a
b
a

双引号

[[email?protected] ~]# sed "s#$x#$y#g" test.txt 
b
b
b

?

?

分组替换( )1的使用说明

sed软件的( )的功能可以记住正则表达式的一部分,其中,1为第一个记住的模式即第一个小括号中的匹配内容,2第二记住的模式,即第二个小括号中的匹配内容,sed最多可以记住9个。?

?

例:

echo My name is  mike,I am 13 years old. 如果想保留这一行的单词mike,删除剩下的部分,使用圆括号标记想保留的部分
[[email?protected] ~]# echo My name is  mike,I am 13 years old. |sed s#^.*is ([a-z].*),.*$#1#g
mike

-r 支持正则表达式 , 不需要 加

[[email?protected] ~]# echo My name is  mike,I am 13 years old. |sed -r s#^.*is ([a-z].*),.*$#1#g
mike

()是扩展正则表达式的元字符,sed软件默认识别基本正则表达式,想要使用扩展正则需要使用转义,即()。sed使用-r选项则可以识别扩展正则表达式,此时使用()反而会出错

?

特殊符号&代表被替换的内容

&等于被替换的内容 0 ,把1到3行的0改成 100

[[email?protected] ~]# sed 1,3s/0/10&/ person.txt 
11001,CEO
11002,CTO
11003,COO

?

企业案例5:批量重命名文件

当前目录下有文件如下所示:

[[email?protected] ~]# mkdir -p /test/
[[email?protected] ~]# cd /test/ ; touch stu_102999_{1..5}_finished.jpg
[[email?protected] test]# ls
stu_102999_1_finished.jpg  stu_102999_3_finished.jpg  stu_102999_5_finished.jpg
stu_102999_2_finished.jpg  stu_102999_4_finished.jpg

要求用sed命令重命名,效果为stu_102999_1_finished.jpg==>stu_102999_1.jpg,即删除文件名的_finished

?

[[email?protected] test]# ls| sed  s#^(.*).finished(.*)#mv & 12#g
mv stu_102999_1_finished.jpg stu_102999_1.jpg
mv stu_102999_2_finished.jpg stu_102999_2.jpg
mv stu_102999_3_finished.jpg stu_102999_3.jpg
mv stu_102999_4_finished.jpg stu_102999_4.jpg
mv stu_102999_5_finished.jpg stu_102999_5.jpg
[[email?protected] test]# 
[[email?protected] test]# 
[[email?protected] test]# ls| sed  s#^(.*).finished(.*)#mv & 12#g|bash
[[email?protected] test]# ls
stu_102999_1.jpg  stu_102999_2.jpg  stu_102999_3.jpg  stu_102999_4.jpg  stu_102999_5.jpg

?

?

?查

p 输出指定内容,但默认会输出2次匹配的结果,因此使用n取消默认输出

p要和 -n 配合使用

?

按行查询

打印文本第二行?

也可以这样写 sed -n ‘2‘p?

[[email?protected] ~]# sed -n 2p person.txt 
102,CTO

?

打印文本第二行,第三行

说明:取行就用sed,最简单

[[email?protected] ~]# sed -n 2,3p person.txt 
102,CTO
103,CFO

?

打印奇数行

[[email?protected] ~]# sed -n 1~2p person.txt 
101,CFO
105,COO

?

把所有行打印, sed -n ‘‘p person.txt

或者

?

[[email?protected] ~]# sed -n p person.txt 
101,CIO
105,COO

[[email?protected] ~]# sed -n ‘‘p person.txt 
101,COO

?

?

按字符串查询

打印 匹配对应字符串的行

打印jack的行

[[email?protected] ~]# sed -n /jack/p person.txt 
102,CTO

打印jack字符串 到 feixue字符串的行?

?

?

[[email?protected] ~]# sed -n /jack/,/feixue/p person.txt 
102,CFO
104,CIO
混合查询

打印第二行到 feixue那行?

[[email?protected] ~]# sed -n 2,CIO

?

如何只用一个sed取出第2和第4行????

[[email?protected] ~]# sed -n 2p;4p person.txt 
102,CIO

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读