sed的详细用法

sed(Stream EDitor)是一款流编辑器,用来对文本进行过滤与替换操作。其原理是:通过文件或管道读取文件内容,但是sed默认并不直接修改源文件,而是一次仅读取文件的一行至模式空间(pattern space)根据sed指令进行编辑并输出结果后清除模式空间,即所有的操作都是在模式空间中进行的。

sed工作流程.png

语法格式

sed [option]... 'script' inputfile...

OPTIONS

-n,--quite,--silent:静默输出,即不输出模式中的内容至输出
-e script:使用多个脚本指令执行编辑
-f /PATH/TO/SCRIPT_FILE:从指定的文件中读取编辑脚本
-r:支持在脚本中使用正则表达式
-i,--in-place:直接在文件原处执行编辑,即修改源文件

SCRIPT,地址+编辑指令

地址定界

(1) 不给地址:对全文进行处理;
(2) 单地址
    #:指定的行
    $:文件的最后一行
    /PATTERN/:被模式匹配到的每一行
(3) 地址范围
    m,n:指定m行到n行
    #,+n:指定#行到#+n行
    /pat1/,/pat2/:匹配到的pat1到pat2之间的行
    #,/pat/:第#行到匹配到pat
(4) 步进:~
注意:如果//中正则表达式为空,则匹配最近一次正则表达式的匹配地址!

编辑命令

d:删除
p:显示模式空间的内容
a [\]text:在行后面追加内容,支持使用\n(换行符)实现多行追加
i [\]text:在行前面插入内容,支持使用\n(换行符)实现多行追加
c [\]text:替换行为单行或多行文本,支持使用\n(换行符)
w /PATH/TO/SOMEFILE:保存模式空间匹配到的行至指定文件中
r /PATH/FROM/SOMEFILE:读取指定文件的文本流至模式空间中匹配到的行的行后
=:为模式空间中的行打印行号
!:取反条件
s/pattern/replacement/flags:替换,支持使用其他分隔符,如:s@@@, s###
    替换标记(flags):
        #:替换行内匹配到的第#次的内容
        g:行内全局替换
        p:显示替换成功的行
        w /PATH/TO/SOMEFILE:将替换后的结果保存至指定文件
    replacement:
        &:用pattern匹配到的内容进行替换
        \n:在pattern中使用\(\)指定时,匹配第n个子串

示例

1、删除/boot/grub/grub.conf文件中所有以空白开头的行行首的空白字符;

# sed 's/^[[:space:]]\+//' /boot/grub/grub.conf

2、删除/etc/fstab文件中所有以#开头,后面至少跟一个空白字符的行的行首的#和空白字符;

# sed 's/^#[[:space:]]\+//' /etc/fstab

3、echo一个绝对路径给sed命令,取出其基名;进一步的,取出其目录名;

# echo "/tmp/test/fstab" | sed 's/[^/]\+\/\?$//'

基于sed脚本文件进行文本处理

用法

sed -f SCRIPT_FILE FILE

SCRIPT_FILE

address{
command1
command2
...
}
命令使用花括号进行组合,使命令序列作用于同一个地址。另外,第一个命令可以和左花括号在同一行,但右花括号必须单独处于一行。并且,命令后添加空格会产生错误。

sed的高级应用

除了存放当前输入行缓冲区的模式空间,sed还有一个保持空间(hold space)的缓冲区。模式空间的内容可以复制到保持空间,保持空间的内容也可以复制到模式空间。

高级编辑命令

h:把模式空间中的内容覆盖至保持空间
H:把模式空间中的内容追加至保持空间
g:从保持空间取出数据覆盖至模式空间
G:从保持空间取出数据追加至模式空间
x:把模式空间中的内容与保持空间中的内容进行互换
n:读取匹配到的行的下一行至模式空间
N:追加匹配到的行的下一行至模式空间
d:删除模式空间中的行
D:删除多行模式空间中的所有行

常用高级命令

sed -n 'n;p' FILE:显示偶数行
sed '1!G;h;$!d' FILE:逆向显示文件内容
sed '$!N;$!D' FILE: 取出文件后两行;
sed '$!d' FILE:取出文件最后一行;
sed 'G' FILE: 
sed '/^$/d;G' FILE: 
sed 'n;d' FILE: 显示奇数行;
sed -n '1!G;h;$p' FILE: 逆向显示文件中的每一行;

原创文章,作者:Jeason,如若转载,请注明出处:http://www.178linux.com/58292

(0)
JeasonJeason
上一篇 2016-11-14 08:28
下一篇 2016-11-14 08:28

相关推荐

  • 运维工程师技能需求排行

    这是我今天在拉勾网搜索运维,翻完了4四页也招聘信息之后得到的,我的目的是想要看看之后的学习,哪个更应该成为重点,有些在我意料之中,有些还真的没想到,算是努力了一个小时的收获吧,分享给大家。
    注意:其中的看法仅代表个人观点,很多都是依靠我自己的学习经验和工作经验累积的

    Linux干货 2017-12-12
  • Linux文件管理类命令

    文件管理工具:cp,mv,rm cp命令:copy,用于实现复制功能      源文件 —-> 目标文件        cp [OPTION]… [-T] SOURCE DEST   #单源复制        …

    Linux干货 2016-08-22
  • 作业:0803日

    1:三种权限rwx对文件和目录的不同意义:       对文件: r:能够查看文件内容 w:修改文件内容 x:执行文件,通常文件的执行权限能够发起一个进程       对目录: r: 能够cd进目录,使用ls查看目录内的文件列表 w: 能够…

    Linux干货 2016-08-05
  • Linux 系统终端

    Linux系统的主要终端主要包含:控制台终端、控制终端、串口终端、伪终端、虚拟终端。 控制台终端:在Linux 系统中,计算机显示器通常被称为控制台终端(Console)内核将信息送到控制台终端上(/dev/console), 通过与console相关联的虚拟终端将信息显示到屏幕上。再开机过程中屏幕输出的信息,这个屏幕就是Console; 控制终端:键盘,显…

    Linux干货 2016-10-19
  • 【招聘福利】深圳/系统运维工程师/薪资弹性,可面谈

    深圳市鑫顺诺科技有限公司 有意向的学员,请联系magedu-小助手QQ:1522609717 职位职能: 系统运维工程师岗位职责:1、公司日常机房网络和办公室网络管理调优、日常办公电脑维护。2、管理、维护网站服务器运行状态,处理系统运行故障;3、负责服务器集群的操作系统安装、升级、定制、部署与维护工作;4、负责服务器集群的系统监控和自动化脚本的设计与部署;5…

    Linux干货 2015-11-06
  • 系统管理之网络管理

    今天给大家分享一些网络方面的知识,,这块的知识很重要哦,都是涉及网络最底层的链路和协议,是我们学习大型服务的基础,和前提.希望大家努力理解这方面的内容,今天的内容大概有这几方面: 1.计算机网络概念 2.计算机网络体系结构 3.物理层 4.数据链路层 5.网络层 6.IP地址及子网 7.传输层 8.应用层 计算机网络概念 计算机网络是个发展中的概念和技术,具…

    Linux干货 2016-09-05