sed处理时,有2个缓冲区:【pattern space】和【hold space】

sed执行过程:

先读入一行,去掉尾部换行符,存入【pattern space】,执行编辑命令。 处理完毕,除非加了-n参数,把现在的【pattern space】打印出来,在后边打印曾去掉的换行符。 把【pattern space】置空。 接着读下一行,处理下一行。

sed的默认输出:【pattern space】里的内容输出到标准输出。

常用选项:

  • 【pattern space】里的内容不输出到标准输出:-n

  • 默认只能执行一个脚本,执行多个脚本:-e script, --expression=script

    可以有多个-e script

  • 如果要执行的脚本特别多,可以指定一个脚本文件:-f /path/to/sed_scirpt

    脚本文件里,每行一个编辑命令。

  • 支持使用扩展的正则表达式,默认是基本正则表达式:-r

  • 直接编辑原文件:-i

地址定界:

1,不给地址:对全文进行处理

2,单地址

  • #:指定行
  • /pattern/:被此模式所匹配到的每一行

3,地址范围

  • $:最后一行

  • #,#:起始和结束

  • #,+#:起始,和从起始加多少行

  • #,/pat1/:起始到,pat1匹配到的行

  • /pat1/,/pat2/:pat1匹配到的行,到pat2匹配到的行

4,步进:~

  • 1~2:1,3,5,7,9.。。行(所有奇数行)
  • 2~2:2,4,6,8,10.。。行(所有偶数行)

编辑命令:

如果有多个命令,则用分号分隔。

  • 删掉【pattern space】里的内容:d

    删除/etc/fstab的第一行到第五行。

    # sed '1,5d' /etc/fstab
  • 打印【pattern space】里的内容:p

    乍一看是打印奇数行,但实际是把偶数行打印了出来,而且奇数行打印了2遍。
    # sed '1~2p' /etc/fstab
    使用-n禁止sed的默认行为后,就是打印奇数行了
    # sed -n '1~2p' /etc/fstab
  • 在行前插入:-i \text 支持使用\n实现多行插入

    # sed '3a \new line\nother line' /etc/fstab
    
    #
    # /etc/fstab
    new line
    other line
    在UUID行前加一段注释:
    # sed '/^UUID/i \#this is base for UUID' /etc/fstab
    #this is base for UUID
    UUID=3d3b316a-529e-484a-9895-e785fdde5365 /boot xfs defaults 0 0
  • 在行后插入:-a \text 支持使用\n实现多行插入

    # sed '3i \new line\nother line' /etc/fstab
    
    #
    new line
    other line
    # /etc/fstab
  • 替换行:-c \text 把匹配到的行,替换成text

    把以UUID开头的行,整行替换成text。

    # sed '/^UUID/c \#this is base for UUID' /etc/fstab
  • 保存匹配到的行,到指定文件中:-w /path/to/save

    把不以#号开头的行,保持到/tmp/fsnew

    # sed -n '/^[^#]/w /tmp/fsnew' /etc/fstab
  • 把指定文件中的内容插入到匹配行的后面:-r /path/to/insert

    在/etc/fstab的第三行的后面,插入/tmp/tst的内容。

    # cat /tmp/tst
    aaa
    bbb
    [root@localhost ~]# sed '3r /tmp/tst' /etc/fstab #
    # /etc/fstab
    aaa
    bbb
  • 在匹配到的行的上一行,加上行号:=

    在以UUID开头的行的上一行加上行号

    # sed '/^UUID/=' /etc/fstab
    
    #
    # /etc/fstab
    # Created by anaconda on Fri Nov 29 16:44:28 2019
    #
    # Accessible filesystems, by reference, are maintained under '/dev/disk'
    # See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info
    #
    /dev/mapper/centos-root / xfs defaults 0 0
    10
    UUID=3d3b316a-529e-484a-9895-e785fdde5365 /boot xfs defaults 0 0
  • 匹配到的行不执行后面的命令;没匹配到的行执行后面的命令:!。注意:!处理命令之前。

    删除不以#开头的行:

    # sed '/^#/!d' /etc/fstab
    #
    # /etc/fstab
    # Created by anaconda on Fri Nov 29 16:44:28 2019
    #
    # Accessible filesystems, by reference, are maintained under '/dev/disk'
    # See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info
    #
  • 查找替换:s/要替换的/替换成的/替换标记。它的分隔符/可以自己指定,常用的有s@@@,s###

    替换标记:

    • 全局替换:g
    • 将替换成功的结果保存到文件:w /path/to/save
    • 显示替换成功的行:p

练习

1,删除test文件中所有以空白字符开头的行的行首的所有空白字符

# cat test
11
222
333
\+:匹配前面的次数为大于等于1
# sed 's@^[[:space:]]\+@@' test
11
222
333
# sed -n 's@^[[:space:]]\+@@p' test
11
333

2,删除/etc/fstab文件中所有以#开头的行的行首的#号及#后面所有空白字符

# sed 's@^#[[:space:]]*@@' /etc/fstab

3,删除/etc/fstab文件中所有以#开头的行的行首的#号及#后面所有空白字符,和删除所有以UUID开头的行

# sed -e 's@^#[[:space:]]*@@' -e '/^UUID/d' /etc/fstab

4,输出一个绝对路径给sed命令,取出其目录部分,其行为类似dirname

message后面如果有/就匹配不成功了。
# echo "/var/log/messages" | sed 's@[^/]\+$@@'
/var/log/
message后面即使有/也能匹配:非/ [^/]:非/
\+:至少一个
/\?:/有0个或者1个
# echo "/var/log/messages/" | sed 's@[^/]\+/\?$@@'
/var/log/
message后面即使有/也能匹配
由于使用了-r(扩展正则表达式),+和?前面的\可以省略了。
# echo "/var/log/messages/" | sed -r 's@[^/]+/?$@@'
/var/log/
[root@localhost ~]#

高级编辑命令

  • 把【pattern space】空间中的内容覆盖到【hold space】空间:h
  • 把【pattern space】空间中的内容追加到【hold space】空间,然后删除【pattern space】空间中的内容:H
  • 把【hold space】空间中的内容覆盖到【pattern space】空间:g
  • 把【hold space】空间中的内容追加到【pattern space】空间,然后删除【hold space】空间中的内容:G
  • 互换【hold space】【pattern space】里的内容:x
  • 把匹配到的行的下一行放入【pattern space】,并把匹配到的行删除掉:n
  • 把匹配到的行的下一行放入【pattern space】,不删除匹配到的行:N
  • 删除【pattern space】空间中的行:d
  • 删除多行模式下【pattern space】里的所有行。(比如用N了,【pattern space】里就有多行):D

1,显示偶数行:

执行过程:先把第一行读入到了【pattern space】,后面的命令的n。n的意思是读下一行,并删除当前【pattern space】里的内容后,再把下一行的内容放入【pattern space】;接下来的命令是p,p就是把当前【pattern space】里的内容输出到标准输出,所有第二行就打印到了标准输出了。然后读第3行,后面的命令是n,就再读一行,以此类推。

# sed -n 'n;p' /etc/fstab

2,倒置文本:

参看:https://blog.csdn.net/itsenlin/article/details/21129405

执行过程:先把第一行读入到了【pattern space】,发现第一行的命令是1!G,所以不做处理;接着是h,则把【pattern space】的内容,覆盖到【hold space】;接着是命令$!d,因为不是最后一行,所以执行d命令,删除【pattern space】里的内容。

读第二行到【pattern space】,发现命令是1!G,由于不是第1行了,所以执行G命令,把hold space】的内容追加到了【pattern space】,这时【pattern space】里放的是第二行和第一行的内容,而且第二行在第一行的前面。接着是$!d,由于不是最后一行,所以执行d命令,删除【pattern space】里的内容。

# cat test
11
222
333
最后一行,没有执行d,而且【pattern space】里的内容,而且没有使用-n,所以就把倒叙打印到标准输出了。
# sed '1!G;h;$!d' ./test
333
222
11

也可以用下面的命令,实现倒置。

由于没有使用d命令,所以【pattern space】里一直有内容,所以就必须用-n,最后一次用p命令把【pattern space】里的内容输出到标准输出。

# sed -n '1!G;h;$p' test

3,取出最后一行:

# sed '$!d' /etc/fstab

4,取出最后二行:

# sed '$!N;$!D' test

5,删除原有的所有空白行,而后为所有的非空白行添加一个空白行

# cat test
11
空行
空行
222
空行
空行
333
444
555
666
# sed '/^$/d;G' test
11
空行
222
空行
333
空行
444
空行
555
空行
666
空行

6,显示奇数行

# sed 'n;d' /etc/fstab

7,在每一行后面添加一个空白行

# sed 'G' /etc/fstab

8,练习H和g的用法:

# cat t2
one
two
three
# sed 'H;g' t2
一个空行
one
一个空行
one
two
一个空行
one
two
three

图解:H是往hold space里追加,hold space里,其实是有一个换行的。所以第一次把one加到hold space后,one的前一行就是空行。

# c/c++ 学习互助QQ群:877684253
![](https://img2018.cnblogs.com/blog/1414315/201811/1414315-20181106214320230-961379709.jpg)
# 本人微信:xiaoshitou5854

sed命令简介的更多相关文章

  1. sed 命令简介

    sed 默认把文件内容全部显示出来(擅长取行  替换) 参数如下: - n 取消默认输出 一般与P一起使用 查看内容‘10,20p’   显示10-20 行的内容 - i 修改文件内容 - i.bak ...

  2. shell基础 -- grep、sed、awk命令简介

    在 shell 编程中,常需要处理文本,这里介绍几个文本处理命令. 一.grep 命令 grep 命令由来已久,用 grep 命令来查找 文本十分方便.在 POSIX 系统上,grep 可以在两种正则 ...

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

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

  4. linux sed命令详解

    简介 sed 是一种在线编辑器,它一次处理一行内容.处理时,把当前处理的行存储在临时缓冲区中,称为“模式空间”(pattern space),接着用sed命令处理缓冲区中的内容,处理完成后,把缓冲区的 ...

  5. [转]sed命令详解

    转载:http://blog.chinaunix.net/u/22677/showart_1076318.html   1.简介 sed是非交互式的编辑器.它不会修改文件,除非使用shell重定向来保 ...

  6. Linux的sed命令

    一.初识sed 在部署openstack的过程中,会接触到大量的sed命令,比如 # Bind MySQL service to all network interfaces.sed -i 's/12 ...

  7. linux sed命令

    一.初识sed 在部署openstack的过程中,会接触到大量的sed命令,比如 # Bind MySQL service to all network interfaces. sed -i 's/1 ...

  8. Linux之Sed命令详解(总结一些实用例子)

    简介 sed 是一种在线编辑器,它一次处理一行内容.处理时,把当前处理的行存储在临时缓冲区中,称为“模式空间”(pattern space),接着用sed命令处理缓冲区中的内容,处理完成后,把缓冲区的 ...

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

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

随机推荐

  1. 生成链接中的全限定URL(Generating Fully Qualified URLs in Links) | 在视图中生成输出URL | 高级路由特性

    结果:<a class="myCSSClass"href="https://myserver.mydomain.com/Home/Index/MyId#myFrag ...

  2. 建立MVC的依赖项注入 Setting up MVC Dependency Injection 精通ASP-NET-MVC-5-弗瑞曼

    The result of the three steps I showed you in the previous section is that the knowledge about the i ...

  3. 浅谈JS异步(asychrouous)

    一.概念 (1)asychronous 异步 是JS这种单线程语言解决多任务的一种方法,将耗时的任务(io)设定为异步工作,先交给浏览器负责相关功能的线程来实现耗时的部分工作,按顺序放入任务队列中,等 ...

  4. Guava中强大的排序器Ordering使用

    一 创建排序器 排序器:可以用来为构建复杂的比较器,以完成集合排序的功能: 本质上来说,Ordering 实例无非就是一个特殊的Comparator 实例. Ordering把很多基于Comparat ...

  5. 虚拟机ubuntu系统怎么添加 VMware tools

    首先弹出光盘 然后安装 点击安装VMware tools 然后进入光盘 打开VMware tools 文件夹 将解压文件拉到桌面上 打开桌面上的文件夹 不选中文件 然后键入下面的内容 输入密码 输入y ...

  6. QIIME2使用方法

    激活qiime2的执行环境:source activate qiime2-2019.4如何查看conda已有的环境:conda info -e 以下分析流程参考:https://docs.qiime2 ...

  7. Java基础知识之设计模式--单例模式

    Java设计模式--单例模式 声明:本文根据慕课网汤小洋老师的精品课程整理来的:慕课网 什么是设计模式(Design Pattern)? 设计模式是一套被反复使用,多数人知晓的,经过分类编目的,代码设 ...

  8. 二、Django学习之增删改查

    增加数据 第一种方式 def index(request): #创建记录方式1 #实例化要添加的记录(对象) student_obj = models.Student( name='dazhuang' ...

  9. SSH(二)

    SSH框架整合的系统架构,Action.Service.Dao.SessionFactory.DataSource都可以作为Spring的Bean组件管理 使用HibernateDaoSupport基 ...

  10. FFMPEG学习----分离视音频里的PCM数据

    /** * 参考于:http://blog.csdn.net/leixiaohua1020/article/details/46890259 */ #include <stdio.h> # ...