1. 统一实验文本

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

[root@MongoDB ~]# cat person.txt
,mike,CEO
,jack,CTO
,yy,CFO
,feixue,CIO
,tom,COO

2. 增删改查

2.1 增

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

2a 追加到第二行后面

[root@MongoDB ~]# sed '2a 106,ben,CSO' person.txt
,mike,CEO
,jack,CTO
106,ben,CSO
,yy,CFO
,feixue,CIO
,tom,COO

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

[root@MongoDB ~]# sed '2i 106,ben,CSO' person.txt
,mike,CEO
106,ben,CSO
,jack,CTO
,yy,CFO
,feixue,CIO
,tom,COO
2.1.2 多行增加

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

[root@MongoDB ~]# sed '2a 106,ben,CSO\n107,peter,CCO' person.txt
,mike,CEO
,jack,CTO
106,ben,CSO
107,peter,CCO
,yy,CFO
,feixue,CIO
,tom,COO

第二种方法:

后面加\ 接上输入文本内容

[root@MongoDB ~]# sed '2a 106,ben,CSO \
> ,peter,CCO' person.txt
,mike,CEO
,jack,CTO
106,ben,CSO
107,peter,CCO
,yy,CFO
,feixue,CIO
,tom,COO
企业案例1:优化SSH配置(一键完成增加若干参数)

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

Port
PermitRootLogin no
PermitEmptyPasswords no
UseDNS no
GSSAPIAuthentication no

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

[root@MongoDB ~]# sed  '13i Port 52113\nPermitRootLogin no\nPermitEmptyPasswords no\nUseDNS no\nGSSAPIAuthentication no' /etc/ssh/sshd_config 

2.2 删

d 删除指定的行

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

[root@MongoDB ~]# sed 'd' person.txt

删除文本第二行

[root@MongoDB ~]# sed '2d' person.txt
,mike,CEO
,yy,CFO
,feixue,CIO
,tom,COO

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

[root@MongoDB ~]# sed '2,5d' person.txt
,mike,CEO

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

[root@MongoDB ~]# sed '2,$d' person.txt
,mike,CEO

删除文本第二行,第三行

[root@MongoDB ~]# sed '2,3d' person.txt
,mike,CEO
,feixue,CIO
,tom,COO

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

[root@MongoDB ~]# sed '1~2d' person.txt
,jack,CTO
,feixue,CIO

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

[root@MongoDB ~]# sed '2,+2d' person.txt
,mike,CEO
,tom,COO

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

[root@MongoDB ~]# sed '/jack/d' person.txt
,mike,CEO
,yy,CFO
,feixue,CIO
,tom,COO

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

[root@MongoDB ~]# sed '/jack/,/yy/d' person.txt
,mike,CEO
,feixue,CIO
,tom,COO

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

[root@MongoDB ~]# sed '/jack/,3d' person.txt
,mike,CEO
,feixue,CIO
,tom,COO

2.3.1 按行替换

c 用新行取代旧行

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

[root@MongoDB ~]# sed '2c 106,benson,CSO' person.txt
,mike,CEO
,benson,CSO
,yy,CFO
,feixue,CIO
,tom,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选项会更改磁盘上的文件内容。
[root@MongoDB ~]# sed 's/jack/ben/g' person.txt
,mike,CEO
,ben,CTO
,yy,CFO
,feixue,CIO
,tom,COO

-i 修改文件内容

[root@MongoDB ~]# sed -i 's/jack/ben/g' person.txt
[root@MongoDB ~]# cat person.txt
,mike,CEO
,ben,CTO
,yy,CFO
,feixue,CIO
,tom,COO
企业案例3:指定行修改配置文件

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

[root@MongoDB ~]# sed '3s#0#9#' person.txt
,mike,CEO
,jack,CTO
,yy,CFO
,feixue,CIO
,tom,COO
变量替换

再新建一个文本

[root@MongoDB ~]# cat test.txt
a
b
a

赋值

[root@MongoDB ~]# x=a
[root@MongoDB ~]# y=b
[root@MongoDB ~]# echo $x $y
a b

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

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

[root@MongoDB ~]# sed s#$x#$y#g test.txt
b
b
b

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

[root@MongoDB ~]# sed 's#$x#$y#g' test.txt
a
b
a

双引号

[root@MongoDB ~]# 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,删除剩下的部分,使用圆括号标记想保留的部分
[root@MongoDB ~]# echo My name is  mike,I am  years old. |sed 's#^.*is \([a-z].*\),.*$#\1#g'
mike

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

[root@MongoDB ~]# echo My name is  mike,I am  years old. |sed -r 's#^.*is ([a-z].*),.*$#\1#g'
mike

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

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

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

[root@MongoDB ~]# sed '1,3s/0/10&/' person.txt
,mike,CEO
,jack,CTO
,yy,CFO
,feixue,CIO
,tom,COO
企业案例5:批量重命名文件

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

[root@MongoDB ~]# mkdir -p /test/
[root@MongoDB ~]# cd /test/ ; touch stu_102999_{..}_finished.jpg
[root@MongoDB 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

[root@MongoDB test]# ls| sed  's#^\(.*\).finished\(.*\)#mv & \1\2#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
[root@MongoDB test]#
[root@MongoDB test]#
[root@MongoDB test]# ls| sed 's#^\(.*\).finished\(.*\)#mv & \1\2#g'|bash
[root@MongoDB 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

[root@MongoDB ~]# sed -n '2p' person.txt
,jack,CTO

打印文本第二行,第三行

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

[root@MongoDB ~]# sed -n '2,3p' person.txt
,jack,CTO
,yy,CFO

打印奇数行

[root@MongoDB ~]# sed -n '1~2p' person.txt
,mike,CEO
,yy,CFO
,tom,COO

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

或者

[root@MongoDB ~]# sed -n 'p' person.txt
,mike,CEO
,jack,CTO
,yy,CFO
,feixue,CIO
,tom,COO [root@MongoDB ~]# sed -n ''p person.txt
,mike,CEO
,jack,CTO
,yy,CFO
,feixue,CIO
,tom,COO
按字符串查询

打印 匹配对应字符串的行

打印jack的行

[root@MongoDB ~]# sed -n '/jack/p' person.txt
,jack,CTO

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

[root@MongoDB ~]# sed -n '/jack/,/feixue/p' person.txt
,jack,CTO
,yy,CFO
,feixue,CIO
混合查询

打印第二行到 feixue那行

[root@MongoDB ~]# sed -n '2,/feixue/p' person.txt
,jack,CTO
,yy,CFO
,feixue,CIO

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

[root@MongoDB ~]# sed -n '2p;4p' person.txt
,jack,CTO
,feixue,CIO

linux sed 命令 实现对文件的增删改替换查 实验的更多相关文章

  1. Linux sed命令操作 删除文件每一行的前k个字符、在文本的行尾或行首添加字符

    删除文件每一行的前k个字符 $ cat tmp.txt # 删除每行第一个字符 $ sed 's/.//' tmp.txt # 删除每行前两个字符 $ sed 's/..//' tmp.txt # 删 ...

  2. 轻松学会文本处理工具之二 linux sed命令

    sed命令的语法格式: sed的命令格式: sed [option]  'sed command'filename sed的脚本格式:sed [option] -f  'sed  script'fil ...

  3. linux sed命令参数及用法详解

    linux sed命令参数及用法详解 http://blog.csdn.net/namecyf/article/details/7336308 1. Sed简介 sed 是一种在线编辑器,它一次处理一 ...

  4. [转帖]linux sed命令

    linux sed命令就是这么简单 https://www.cnblogs.com/wangqiguo/p/6718512.html 用到的最多的就是一个sed -i 's/nn/mm/' 的命令了. ...

  5. 理解linux sed命令

    理解linux sed命令(2010-02-27 18:21:20) 标签:linuxshellsed替换 分类:革命本钱 1. Sed简介sed是一种在线编辑器,它一次处理一行内容.处理时,把当 前 ...

  6. 【转】linux sed命令

    转自:linux sed命令就是这么简单 参考:Linux三大剑客之sed:https://blog.csdn.net/solaraceboy/article/details/79272344 阅读目 ...

  7. 如何将Linux rm命令删除的文件放入垃圾箱

    因为rm命令删除的文件是不会放入垃圾箱的,所以无法恢复,下面小编就给大家介绍一种方法,通过替换Linux rm命令的方法,从而将rm命令删除的文件放入垃圾箱. 方法: 1. 在/home/userna ...

  8. Linux ln命令:在文件之间建立链接(硬链接和软链接)详解版1

    Linux ln命令:在文件之间建立链接(硬链接和软链接)详解版 < Linux创建文件及修改文件时间戳(touch命令)Linux复制文件和目录(cp命令) > <Linux就该这 ...

  9. Linux— file命令 用于辨识文件类型

    Linux file命令用于辨识文件类型. 通过file指令,我们得以辨识该文件的类型. 语法 file [-bcLvz][-f <名称文件>][-m <魔法数字文件>...] ...

随机推荐

  1. 配置文件加载位置与多profile文件

    一. 我们在编写配置文件时,文件名可以是: application-{profile}.properties 例如:我们有几个配置文件对应的是项目不同时期的配置文件 1.application-sit ...

  2. thinkphp一对多关系

    兹有用户表user和评论表comment 一对一 public function returnmany() { return $this->hasOne('commnet','uid','use ...

  3. 【NOIP2012模拟10.25】单元格

    题目 在一个R行C列的表格里,我们要选出3个不同的单元格.但要满足如下的两个条件: (1)选中的任意两个单元格都不在同一行. (2)选中的任意两个单元格都不在同一列. 假设我们选中的单元格分别是:A, ...

  4. Java面试之持久层(10)

    91,什么是ORM?         对象关系映射(Object-Relational Mapping,简称ORM)是一种为了解决程序的面向对象模型与数据库的关系模型互不匹配问题的技术: 简单的说,O ...

  5. Shell-06 函数

    Shell-06 函数 #编写脚本,使用chkconfig命令,循环执行,关闭所有5级别服务 #!/bin/bash name=`chkconfig --list | cut -d' ' -f1` f ...

  6. SpringBoot与jackson.databind兼容报错问题

    SpringBoot与jackson.databind兼容报错问题 ———————————————— 1.SpringBoot版本V2.0.0其依赖的jackson-databind版本为V2.9.4 ...

  7. PHP 字符串相关常识

    0x00 前言 第一次遇见字符串这个概念是在学 C 语言的时候,那时候觉得字符串也没有什么难的,不就是一个以 \0 结尾的 char 数组而已咯.后来在学习 PHP 的过程中也同样保持这个观念,不过在 ...

  8. #419 Div2 Problem B Karen and Coffee (统计区间重叠部分 && 前缀和)

    题目链接 :http://codeforces.com/contest/816/problem/B 题意 :给出 n 表示区间个数,限定值 k 以及问询次数 q,当一个数被大于或等于 k 个区间重复覆 ...

  9. POJ 3180 牛围着池塘跳舞 强连通分量裸题

    题意:一群牛被有向的绳子拴起来,如果有一些牛(>=2)的绳子是同向的,他们就能跳跃.求能够跳跃的组数. #include <iostream> #include <cstdio ...

  10. Html !!!了解一下

    1.什么是超文本 超文本:就是指页面内可以包含图片,链接,甚至音乐,程序等非文字元素; 最常用的超文本格式:超文本标记语言(标记通用语言的下个一个应用)和富文本格式 超文本语言的特点: 简易性:超文本 ...