Sed简介

Sed是Stream Editor(流编辑器)缩写,是操作、过滤和转换文本内容的强大工具,常用功能有增删改查。

Sed命令执行流程

Sed语法格式

Sed [option] ‘[匹配][处理]’ [file]

说明:个人将语法中sed命令部分分为先匹配后处理两个部分。Sed可以接文件,也可以接标准输入,比如管道等。

查看Sed版本

[root@web01 mnt]# sed --version
GNU sed version 4.2.1

统一实验文本

[root@web01 sed]# cat >> person.txt << EOF
> 101,peterwang,CEO
> 102,zhangyao,CTO
> 103,Alex,COO
> 104,yy,CFO
> 105,feixue,CIO
> EOF

单行增加

[root@web01 sed]# sed '2a 106,dandan,CSO' person.txt
101,peterwang,CEO
102,zhangyao,CTO
106,dandan,CSO // a 追加文本到指定行后
103,Alex,COO
104,yy,CFO
105,feixue,CIO [root@web01 sed]# sed '2i 106,dandan,CSO' person.txt
101,peterwang,CEO
106,dandan,CSO // i 插入文本到指定行前
102,zhangyao,CTO
103,Alex,COO
104,yy,CFO
105,feixue,CIO

多行增加

[root@web01 sed]# sed '2a 106,dandan,CSO\n107,bingbing,CCO' person.txt
101,peterwang,CEO
102,zhangyao,CTO
106,dandan,CSO
107,bingbing,CCO
103,Alex,COO
104,yy,CFO
105,feixue,CIO [root@web01 sed]# sed '2a 106,dandan,CSO\
> 107,bingbing,CCO' person.txt
101,peterwang,CEO
102,zhangyao,CTO
106,dandan,CSO
107,bingbing,CCO
103,Alex,COO
104,yy,CFO
105,feixue,CIO

匹配:指定执行的行范围

Sed可以对特定的行进行处理,如果不指定那么sed默认匹配所有行。

用法:n1[,n2]{sed-commands}  地址用逗号分割,可以是数字、正则或二者的组合。

举例:

  1. 10{sed-commands}   对第10行操作
  2. 10,20{sed-commands}   对10-20行进行操作,包括第10,20行
  3. 10,+20{sed-commands}  对10-30行进行操作(从第十行开始向后20行),包括第10,30行
  4. 1~2{sed-commands}      对 1,3,5,7…行进行操作(~2表示间隔为2)
  5. 10,${sed-commands}     对10到最后一行进行操作($代表最后一行),包括第10行
  6. /peter/{sed-commands}   匹配peter所在的行进行操作
  7. /peter/,/Alex/{sed-commands}  对peter所在行到Alex所在行进行操作
  8. /peter/,10{sed-commands}   对peter所在行到第10行进行操作
  9. 1,/Alex/{sed-commands}  对第1行到Alex所在行进行操作
  10. /peter/,+2{sed-commands}   对peter所在行到其后2行进行操作

删(d)

[root@web01 sed]# sed '2d' person.txt
101,peterwang,CEO
103,Alex,COO
104,yy,CFO
105,feixue,CIO [root@web01 sed]# sed '2,5d' person.txt
101,peterwang,CEO [root@web01 sed]# sed '2,$d' person.txt
101,peterwang,CEO [root@web01 sed]# sed '1~2d' person.txt
102,zhangyao,CTO
104,yy,CFO [root@web01 sed]# sed '1,+2d' person.txt
104,yy,CFO
105,feixue,CIO [root@web01 sed]# sed '/peter/d' person.txt
102,zhangyao,CTO
103,Alex,COO
104,yy,CFO
105,feixue,CIO [root@web01 sed]# sed '/peter/,/Alex/d' person.txt
104,yy,CFO
105,feixue,CIO [root@web01 sed]# sed '/peter/,3d' person.txt
104,yy,CFO
105,feixue,CIO

整行替换(c)

[root@web01 sed]# sed '2c 106,dandan,CSO' person.txt
101,peterwang,CEO
106,dandan,CSO
103,Alex,COO
104,yy,CFO
105,feixue,CIO

部分替换(s)

基本格式: sed ‘s#匹配文本#替换文本#g’   sed –i  ‘s#匹配文本#替换文本#g’

  1. s 是sed命令,表示替换;
  2. g 是命令s的替换标记,表示对该行全局替换,不加g则只替换每一行匹配到的第一个文本;
  3. # 是定界符,可以是/ # @等任意字符,习惯上用 #;
  4. 匹配文本可以用正则表达式,替换文本不能。
  5. - i 是sed的一个选项,表示对文件进行修改,通常不加i时,sed只是对内存模式空间里的数据进行操作,不修改磁盘中的源文件。
[root@web01 sed]# sed 's#zhangyao#peter#g' person.txt
101,peterwang,CEO
102,peter,CTO
103,Alex,COO
104,yy,CFO
105,feixue,CIO [root@web01 sed]# sed -i 's#zhangyao#peter#g' person.txt
[root@web01 sed]# cat person.txt
101,peterwang,CEO
102,peter,CTO
103,Alex,COO
104,yy,CFO
105,feixue,CIO

变量替换

#支持使用变量表示数据
[root@web01 sed]# cat >> test.txt << EOF
> a
> b
> a
> EOF
[root@web01 sed]# x=a
[root@web01 sed]# y=b
[root@web01 sed]# echo $x $y
a b
[root@web01 sed]# sed 's#'$x'#'$y'#g' test.txt
b
b
b

分组替换

基本格式

#分组替换常用于取某一行里的动态数据
[root@web01 sed]# echo "I am Linux student" | sed -r 's#^.*am (.*) stu.*$#\1#g'
Linux // \1 表示的是前面()里的内容 -r 表示使用扩展正则

案例:取IP地址

[root@web01 sed]# ifconfig eth0            // 取出10.0.0.8
eth0 Link encap:Ethernet HWaddr 00:0C:29:1D:68:4B
inet addr:10.0.0.8 Bcast:10.0.0.255 Mask:255.255.255.0
inet6 addr: fe80::20c:29ff:fe1d:684b/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:10434 errors:0 dropped:0 overruns:0 frame:0
TX packets:7185 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:4253413 (4.0 MiB) TX bytes:742419 (725.0 KiB) [root@web01 sed]# ifconfig eth0 | sed -nr 's#^.*dr:(.*) Bc.*$#\1#gp'
10.0.0.8
[root@web01 sed]# ifconfig eth0 | awk -F "[ :]+" 'NR==2{print $4}' // 推荐
10.0.0.8
[root@web01 sed]# grep "IPADDR" /etc/sysconfig/network-scripts/ifcfg-eth0 | cut -d = -f 2
10.0.0.8

按行查询

[root@web01 sed]# sed -n '2p' person.txt   // -n 是sed 选项,表示取消默认输出
102,zhangyao,CTO [root@web01 sed]# sed -n '2,3p' person.txt
102,zhangyao,CTO
103,Alex,COO

按字符串查询

[root@web01 sed]# sed -n '/CTO/p' person.txt
102,zhangyao,CTO [root@web01 sed]# sed -n '/CTO/,/CFO/p' person.txt
102,zhangyao,CTO
103,Alex,COO
104,yy,CFO

混合查询

[root@web01 sed]# sed -n '2,/CFO/p' person.txt
102,zhangyao,CTO
103,Alex,COO
104,yy,CFO

特殊用法

-i选项修改前备份,-i后面可以接后缀,这样sed就会先备份再修改

[root@web01 sed]# cat person.txt
101,peterwang,CEO
102,zhangyao,CTO
103,Alex,COO
104,yy,CFO
105,feixue,CIO
[root@web01 sed]# sed -i.bak '2s#zhangyao# #g' person.txt
[root@web01 sed]# ls
person.txt person.txt.bak test.txt
[root@web01 sed]# head -2 person.txt
101,peterwang,CEO
102, ,CTO
[root@web01 sed]# head -2 person.txt.bak
101,peterwang,CEO
102,zhangyao,CTO

只对匹配到的第一行进行操作

比如我们要修改nginx端口
#第一种方法会匹配所有包含listen的行然后将80替换为8080
sed -i '/listen/{s/80/8080/}' nginx.conf.default
#第二种方法指定了一个范围,替换范围种所有的80为8080,但如果我们确定该范围内只有listen关键字行包含80,实际上这就相当于只对匹配到的第一个listen行进行端口替换
sed -i '0,/listen/{s/80/8080/}' nginx.conf.default

  

Shell三剑客之sed命令的更多相关文章

  1. shell 三剑客之 sed 命令详解

    sed 编辑命令 sed 编辑命令对照表 把 /etc/passwd 文件赋值到当前路径下,进行操作 cp /etc/passwd ./ cat -n passwd sed 删除操作 删除 passw ...

  2. Linux实战教学笔记12:linux三剑客之sed命令精讲

    第十二节 linux三剑客之sed命令精讲 标签(空格分隔): Linux实战教学笔记-陈思齐 ---更多资料点我查看 1,前言 我们都知道,在Linux中一切皆文件,比如配置文件,日志文件,启动文件 ...

  3. 文本处理三剑客之sed命令

    第十八章.文本处理三剑客之sed命令 目录 sed介绍 sed命令常用选项 sed常用编辑命令 sed使用示例 sed高级语法 18.1.sed简介 sed全名stream editor,流编辑器,s ...

  4. 在shell中使用sed命令替换/为\/

    sed命令相关: https://www.cnblogs.com/ggjucheng/archive/2013/01/13/2856901.html https://www.cnblogs.com/D ...

  5. day14 linux三剑客之sed命令

    day14 linux三剑客之sed命令 sed命令 Sed 主要用来自动编辑一个或多个文件.简化对文件的反复操作.编写转换程序等. sed(流式编辑器) : sed主要用来修改文件. 1.sed命令 ...

  6. linux三剑客之sed命令

    一.前言 我们都知道,在Linux中一切皆文件,比如配置文件,日志文件,启动文件等等.如果我们相对这些文件进行一些编辑查询等操作时,我们可能会想到一些vi,vim,cat,more等命令.但是这些命令 ...

  7. shell三剑客之sed

    背景 sed(Stream Editor 流编辑器),作为三剑客的一份子,主要的功能有增删改查.为什么称之为"流"编辑器呢?大家知道:在Linux文件系统中,一切都可以作为文件来处 ...

  8. 【三剑客】sed命令

    1. Sed 简介 sed 是Stream Editor(流编辑器)的缩写,是操作.过滤和转换文本内容的强大工具.常用功能有增删改查,过滤,取行.   sed 是一种新型的,非交互式的编辑器. 它能执 ...

  9. linux下shell脚本中sed命令的用法

    先来给一个案例: #将old.sql文件中的符号“|”替换为“,”,并保存到test.sql文件中 sed "s/|/,/g" "old.sql"> te ...

随机推荐

  1. CentOS 服务ftp(vsftpd)

    1.检查是否已经安装vsftpd yum list installed | grep vsftpd 2.安装vsftpd yum install -y vsftpd 3.检查vsftpd system ...

  2. POJ1066:Treasure Hunt——题解

    http://poj.org/problem?id=1066 题目大意:给一个由墙围成的正方形,里面有若干墙,每次破墙只能从(当前看到的)墙的中点破,求最少破多少墙才能看到宝藏. —————————— ...

  3. BZOJ1833:[ZJOI2010]数字计数——题解

    http://www.lydsy.com/JudgeOnline/problem.php?id=1833 https://www.luogu.org/problemnew/show/P2602 给定两 ...

  4. 洛谷 P4964 绫小路的特别考试 解题报告

    P4964 绫小路的特别考试 题目背景 这世界上「胜利」便是一切.无关乎过程. 要付出多少牺牲都无所谓.只要最后我「胜出」那就行了. 题目描述 一场新的特别考试来临了,这次的考试内容是(wan e d ...

  5. scrapy架构设计分析

    scrapy是一个Python爬虫框架.我们自己用requests也能写爬虫(GET某个URL,然后Parse网页的内容),那么,问题来了,scrapy高明在哪些地方呢?下面就来讨论下这个话题,看看业 ...

  6. String作为输出型参数时获取不到值

    有时候在一个方法中,我们需要返回多个字符串,而又不想将这些字段包成一个类.此时就需要使用输出型参数. 但是如果将输出型参数的类型声明为String,那么调用该方法后,是获取不到我们想要的值的. 测试代 ...

  7. 可能是国内最火的开源项目 —— C/C++ 篇

    程序员们,在北上广你还能买房吗? >>>   推荐阅读: 可能是最火的开源项目 -- Java 篇 可能是国内最火的开源项目 -- PHP 篇 可能是国内最火的开源项目 -- Pyt ...

  8. Linux下Tomcat重启脚本

    我们重启Tomcat服务的时候,Tomcat自带的shutdown.sh脚本有时并不能真正杀死进程,经常需要我们用“kill -9 pid”的方式来杀死进程. 下面的脚本可以简化我们的操作,执行可杀死 ...

  9. 【BZOJ】1577: [Usaco2009 Feb]庙会捷运Fair Shuttle

    [题意]公车从1开到n,有k群牛想从一个点到达另一个点,公车最多乘坐c个人,牛群可以拆散,问最多载多少牛到达目的地. [算法]贪心+堆 [题解]线段和点的贪心,一般有按左端点排序和按右端点排序两种方法 ...

  10. 【游记】CTSC&APIO2017

    GDOI回来不到两天就前往北京参加CTSC和APIO. CTSC Day1 [考试] T1一道神奇的题,很快想到O(n2)做法,感觉ctsc题目难度应该很大,就没马上想着出正解(事实上这届CTSC偏水 ...