Sed工作原理

sed是一个非交互式的流编辑器。所谓非交互式,是指使用sed只能在命令行下输入编辑命令来编辑文本,然后在屏幕上查看输出;而所谓流编辑器,是指sed每次只从文件(或输入)读入一行,然后对该行进行指定的处理,并将结果输出到屏幕(除非取消了屏幕输出又没有显式地使用打印命令),接着读入下一行。整个文件像流水一样被逐行处理然后逐行输出。

下面我们看一下sed的工作过程。

sed不是在原输入上直接进行处理的,而是先将读入的行放到缓冲区中,对缓冲区里的内容进行处理,处理完毕后也不会写回原文件(除非用shell的输出重定向来保存结果),而是直接输出到屏幕上。sed运行过程中维护着两个缓冲区,一个是活动的“模式空间(pattern space)”,另一个是起辅助作用的“暂存缓冲区(holding space)”。一般情况下,每当运行sed,sed首先把第一行装入模式空间,进行处理后输出到屏幕,然后将第二行装入模式空间替换掉模式空间里原来的内容,然后进行处理,以此类推。

一般情况下暂存缓冲区是用不到的,但有特殊的命令可以在模式空间与暂存缓冲区之间交换数据,后文将有介绍。由于sed对文本的所有操作都是在缓冲区里进行的,所以不会对原文件造成任何破坏。

4.2            Sed命令格式

sed的命令格式如下:

sed [-Options] [‘Commands’] filename

其中,Command是一个sed命令,sed命令一定要被包含在一对单引号中,以免被shell解释,其格式如下:

[address-range][sed-command]或

[Pattern-to-match][sed-command]

address-range是指要处理的行的范围,又叫地址范围;pattern-to-match是一个要匹配的模式,是一个正则表达式,sed-command是一个sed命令,用来对指定的行进行处理。下面是一个简单的例子:

sed –n ‘1,3p’ students

这个命令将文件students中的第1到3行打印到屏幕。注意,地址范围和sed命令之间没有空格,如果加入空格,sed也会将其忽略。参数-n用来取消默认输出。默认情况下,sed每读入一行到模式空间,无论是否对其进行处理,在读入下一行之前多要将模式空间中的内容输出到屏幕上。参数-n可以用来取消这种默认的输出,只有当用户用命令p时才将指定的行输出到屏幕。如果没有用参数-n而又对指定行执行了p命令,那么这些行将会被打印两次。

地址范围可以是一个数字,这个数字代表了一个行号;也可以是一个用逗号分隔的两个数字表示的范围(包括这两行)。范围可以是数字,正则表达式,或是两者的组合。

pattern-to-match是一个要匹配的模式,sed将会对所有匹配的行执行sed-command。其实,这里的pattern-to-match也可以看作是一个地址,这个地址是所有与指定模式匹配的行的行号。因此sed的格式可以归纳为一种:

sed [-Options] ‘[address-range][sed-command]’ filenam

              

sed命令:
    ## 按行处理,复制一行出来到自己专用--->模式空间(pattern space),然后匹配处理
    ## 保持空间(hold space)
    #
    文本处理三剑客:
        grep, egrep, fgrep:文本过滤器
        sed:Stream EDitor,流编辑器,行
        awk:文本格式化工具,报告生成器

    sed [OPTION]...  ‘script‘  [input-file] ...
        script:
            地址定界编辑命令

        常用选项:
            -n:不输出模式空间中的内容至屏幕;
            -e script, --expression=script:多点编辑;
            -f  /PATH/TO/SED_SCRIPT_FILE
                每行一个编辑命令;
            -r, --regexp-extended:支持使用扩展正则表达式;
            -i[SUFFIX], --in-place[=SUFFIX]:直接编辑原文件 ;

            ~]# sed  -e  ‘[email protected]^#[[:space:]]*@@‘   -e  ‘/^UUID/d‘  /etc/fstab

        地址定界:
            (1) 空地址:对全文进行处理;
            (2) 单地址:
                #:指定行;
                /pattern/:被此模式所匹配到的每一行;
            (3) 地址范围
                #,#:
                #,+#:
                #,/pat1/
                /pat1/,/pat2/
                $:最后一行;
            (4) 步进:~
                1~2:所有奇数行
                2~2:所有偶数行

        编辑命令:
            d:删除;
            p:显示模式空间中的内容;
            a  \text:在行后面追加文本“text”,支持使用\n实现多行追加;
            i  \text:在行前面插入文本“text”,支持使用\n实现多行插入;
            c  \text:把匹配到的行替换为此处指定的文本“text”;
            w /PATH/TO/SOMEFILE:保存模式空间匹配到的行至指定的文件中;
            r  /PATH/FROM/SOMEFILE:读取指定文件的内容至当前文件被模式匹配到的行后面;文件合并;
            =:为模式匹配到的行打印行号;
            !:条件取反;
                地址定界!编辑命令;
            s///:查找替换,其分隔符可自行指定,常用的有[email protected]@@, s###等;
                替换标记:
                    g:全局替换;
                    w /PATH/TO/SOMEFILE:将替换成功的结果保存至指定文件中;
                    p:显示替换成功的行;

                练习1:删除/boot/grub/grub2.cfg文件中所有以空白字符开头的行的行首的所有空白字符;
                    ~]# sed  ‘[email protected]^[[:space:]]\[email protected]@‘ /etc/grub2.cfg
                练习2:删除/etc/fstab文件中所有以#开头的行的行首的#号及#后面的所有空白字符;
                    ~]# sed  ‘[email protected]^#[[:space:]]*@@‘  /etc/fstab
                练习3:输出一个绝对路径给sed命令,取出其目录,其行为类似于dirname;
                    ~]# echo "/var/log/messages/" | sed ‘[email protected][^/]\+/\[email protected]@‘
                    ~]# echo "/var/log/messages" | sed -r ‘[email protected][^/]+/[email protected]@‘

        高级编辑命令:
            h:把模式空间中的内容覆盖至保持空间中;
            H:把模式空间中的内容追加至保持空间中;
            g:把保持空间中的内容覆盖至模式空间中;
            G:把保持空间中的内容追加至模式空间中;
            x:把模式空间中的内容与保持空间中的内容互换;
            n:覆盖读取匹配到的行的下一行至模式空间中;
            N:追加读取匹配到的行的下一行至模式空间中;
            d:删除模式空间中的行;
            D:删除多行模式空间中的所有行;

            示例:
                sed  -n  ‘n;p‘  FILE:显示偶数行;
                sed  ‘1!G;h;$!d‘  FILE:逆序显示文件的内容;
                sed  ’$!d‘  FILE:取出最后一行;
                sed  ‘$!N;$!D‘ FILE:取出文件后两行;
                sed ‘/^$/d;G‘ FILE:删除原有的所有空白行,而后为所有的非空白行后添加一个空白行;
                sed  ‘n;d‘  FILE:显示奇数行;
                sed ‘G‘ FILE:在原有的每行后方添加一个空白行;
时间: 2025-01-17 09:38:09

Sed工作原理的相关文章

sed工作原理和使用方法

1.Sed简介 sed是一种在线编辑器,它一次处理一行内容.处理时,把当前处理的行存储在临时缓冲区中,称为"模式空间"(pattern space),接着用sed命令处理缓冲区中的内容,处理完成后,把缓冲区的内容送往屏幕.接着处理下一行,这样不断重复,直到文件末尾.文件内容并没有改变,除非你使用重定向存储输出. sed工作原理图 2.命令说明 sed [options] 'AddressCommand'  file ...        -n:         静默模式,不再默认显示模

sed的工作原理及使用

1.sed的概念 sed意为流编辑器(Stream Editor),在Shell脚本和Makefile中作为过滤器使用非常普遍,也就是把前一个程序的输出引入sed的输入,经过一系列编辑命令转换为另一种格式输出.sed 是基于Basic模式的,sed和vi都源于早期UNIX的ed工具,所以很多sed命令和vi的末行命令是相同的. 2.sed的工作原理 sed 是一种在线编辑器,它一次处理一行内容.处理时,把当前处理的行存储在临时缓 冲区中,称为"模式空间"(pattern space),

LVS集群之工作原理

  首先我们要了解LVS的工作机制: LVS里Director本身不响应请求,只是接受转发请求到后方,Realservers才是后台真正响应请求. LVS 工作原理基本类似DNAT,又不完全相像,它是一种四层交换,默认情况下通过用户请求的地址和端口来判断用户的请求,从而转发到后台真正提供服务的主机,而判断这种请求的是通过套接字来实现,所以四层就可以实现. 而且这个转发的过程对用户而言是透明的(简单的讲,就是用户访问DR的IP,而DR转发给RSS,而用户不知道这个过程) LVS的工作模式: 1.D

LVS介绍及工作原理图解

很多人使用过LVS集群系统,但对于LVS集群,大多数人不清楚它到底是个什么东西.接下来我们就聊聊LVS及其工作原理. 一.lvs介绍 LVS的英文全名为"Linux Virtual Server",即Linux虚拟服务器,是一个虚拟的四层交换器集群系统,根据目标地址和目标端口实现用户请求转发,本身不产生流量,只做用户请求转发,目前是负载均衡性能最好的集群系统. 二.Lvs原理介绍 图示如下: 1.首先用户向负载均衡器调度器(Director Server)发起请求,负载均衡器将请求发往

CentOS 6.5 分布式文件系统之MogileFS工作原理及实现过程

   MogileFS是一套高效的文件自动备份组件,由Six Apart开发,广泛应用在包括LiveJournal等web2.0站点上.MogileFS由3个部分组成:    第1个部分:是server端,包括mogilefsd和mogstored两个程序.前者即是mogilefsd的tracker,它将一些全局信息保存在数据库里,例如站点domain,class,host等.后者即是存储节点(store node),它其实是个HTTP Daemon,默认侦听在7500端口,接受客户端的文件备份

LVS的工作原理和相关算法

首先我们要了解LVS的工作机制: LVS里Director本身不响应请求,只是接受转发请求到后方,Realservers才是后台真正响应请求. LVS 工作原理基本类似DNAT,又不完全相像,它是一种四层交换,默认情况下来通过用户请求的的地址和端口,来判断用户的请求,从而转发到后台真正提供服务的主机,而判断这种请求的是通过套接字来实现,所以四层就可以实现.而且这个转发的过程对用户而言是透明的(简单的讲,就是用户访问的是DR的IP,而DR转发给RSS,而用户不知道这个过程) LVS的工作模式 1.

分布式文件系统之MogileFS工作原理及实现过程

MogileFS是一套高效的文件自动备份组件,由Six Apart开发,广泛应用在包括LiveJournal等web2.0站点上.MogileFS由3个部分组成:   第1个部分:是server端,包括mogilefsd和mogstored两个程序.前者即是mogilefsd的tracker,它将一些全局信息保存在数据库里,例如站点domain,class,host等.后者即是存储节点(store node),它其实是个HTTP Daemon,默认侦听在7500端口,接受客户端的文件备份请求.在

LVS之原理篇--深入全面理解LVS工作原理

一.介绍 LVS是Linux Virtual Server的简写,即Linux虚拟服务器,是一个虚拟的服务器集群系统.该项目由章文嵩博士成立,是中国国内最早出现的自由软件项目之一. 使用LVS技术要达到的目标是:通过LVS提供的负载均衡技术和Linux操作系统实现一个高性能.高可用的服务器群集,它具有良好可靠性.可扩展性和可操作性.从而以低廉的成本实现最优的服务性能. 负载均衡技术有很多实现方案,如基于DNS域名轮流解析的方法.基于客户端调度访问的方法.基于应用层系统负载的调度方法,还有基于IP

LVS 工作原理解析

LVS即Linux Virtual Server,淘宝大牛章文嵩读博士时发起的开源软件项目,是性能非常好的四层负载均衡集群服务,Linux内核2.4以后已经被直接收录至内核. LVS的工作模式: 在了解工作模式之前首先要晓得为什么会有不同的工作模式,用户的请求进来会先发送到director(virtual server),然后director通过一定的调度算法把请求比较公平的分发到后端的real server,那么自然由real server响应回去给用户. 本文中提到的缩写解释: VIP: D