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. 阿里fastjson解析

    解析案例 String object="{total=1, rows=[{_Account=3646808, UserID=131514, Mt4Name=SewwoaIQQS, Serve ...

  2. ruby 模块 respond_to

    def hi puts 'hi friend' end module Amodule def self.hello puts 'hello friend' end end def rsp(txt) p ...

  3. 使用luabind绑定box2d的lua接口

    最近在使用luabind绑定box2d的lua接口,发现不少问题.写在这里与大家分享. 1. body,fixture,joint的userdata.box2d的userdata的数据类型是void* ...

  4. 01-前言&WEB标准

    人生苦短,要学就只学有用的 [前端教学-前言] 初识web开发 我们先来认识一下web前端 其实前端的工作,大体的概括就是:根据美工给的设计稿,变成web网页,使用后天的接口实现数据的渲染,要是高端一 ...

  5. 02--java--环境搭建

    第一步,下载JDK 去ORACLE官网http://www.oracle.com下载 有安装版和绿色版,安装版一路下一步,绿色版解压缩压缩包就行了 安装版直接自动配置环境变量,绿色版需要自己配置环境变 ...

  6. python笔记04

    数据类型(二) 今日内容 1.列表 2.元组 内容回顾和补充 1.计算机基础 ①硬件:cpu,内存,硬盘,主板,网卡 ②操作系统:linux,centos, Ubuntu,redhat windows ...

  7. 三、Django学习之单表查询接口

    查询接口 all() 查询所有结果,结果是queryset类型 filter(**kwargs) and条件关系:参数用逗号分割表示and关系 models.Student.objects.filte ...

  8. 《考研机试》(一)C/C++基础

    1.setfill/setw使用 2.定义结构体 3.关于字符串读取 4.排序问题:复试不要求一般用:冒泡排序 5.数字和字符之间转换 6.进制转化:10进制转8进制 7.质数判断 8.字符串拷贝函数 ...

  9. FPGA基础知识关键点摘要

    FPGA基础知识关键点摘要 一.组合逻辑和时序逻辑的区别:组合逻辑与输入直接实时相关,时序逻辑还必须在时钟上升沿出发后输出新值,有没有时钟输入是他们最大的区别!组合时序容易出现竞争冒险现象出现亚稳态, ...

  10. Ansible:roles初始化系统

    简介 本文介绍ansible的roles,通过roles来实现系统的初始化,其相当于将ansible的playbook拆分.本文通过Jenkins,传参,调用playbook来初始化系统. Githu ...