2018.5.22 sed详解

概念:

sed全称 Stream EDitor, 行编辑器 ,是一种流编辑器,它一次处理一行内容。处理时,把当前处理的行存储在临时缓冲区中,称为“模式空间”(pattern space),接着用sed命令处理缓冲区中的内容,处理完成后,把缓冲区的内容送往屏幕。然后读入下行,执行下一个循环。这样不断重复,直到文件末尾。文件内容并没有改变,除非使用重定向存储输出或-i。

关于sed处理过程中详细过程:

sed之所以能以行为单位的编辑或修改文本,其原因在于它使用了两个空间:一个是活动的“模式空间(pattern space)”,另一个是起辅助作用的“保持空间(hold space)这2个空间的使用。

模式空间:可以想成工程里面的流水线,数据之间在它上面进行处理。

保持空间:可以想象成仓库,我们在进行数据处理的时候,作为数据的暂存区域。

正常情况下,如果不显示使用某些高级命令,保持空间不会使用到!

 

一般情况下,数据的处理只使用模式空间(pattern space),按照如上的逻辑即可完成主要任务。但是某些时候,通过使用保持空间(hold space)可以进行一些快捷高级的操作。
 

使用方法

    格式: 

sed [OPTION]... {script-only-if-no-other-script} [input-file]...
以上是man帮助中的格式,我个人常用的使用格式:
sed [选项] '[地址界定]编辑命令' [输入文本]

    选项:

-n 不输出模式空间的内容到屏幕
-r   支持使用扩展正则表达式
-e   多点编辑,即能够多次对模式空间内容进行编辑

-f /Path/script_file 从指定路径读取编辑脚本

-i.bak 单纯-i是不输出屏幕直接修改文件,加上.bak或者任意.xxx 表示先备份源文件再修改

 

    地址界定:

此项可选如果不写,则表示对全文进行处理;
地址界定使用的单位:
    #:代表行号
    $:代表最后一行
    /pattern/:被模式匹配到的每一行
    ~:表示不进(配合行号使用)
地址界定格式:
    #,#:表示匹配两个行号之间的行(包含首尾行)
    #,+#:表示第几行开始到之后的n行(包含首尾行)
    /pat1/,/pat2/:表示从第一次匹配到pat1模式到第一次匹配到pat2之间的行,这些行作为一组结果。
                            如果全文还未匹配结束,则继续匹配下一组直到行尾。(贪婪模式)
    #,/pat1/:表示从第几行开始到第一次匹配到pat1模式所在的行
        注意:不存在/pat1/,# 这种界定格式
    #~#:表示第几行开始,以某一步进筛选作为地址界定
        1~2:表示第一行开始,每加2行取值,即表示奇数行
        2~2:表示第二行开始,每加2行取值,即表示偶数行
 

    编辑命令: (粗体常用且重点,后面涉及保持空间即缓冲区高级使用方法)

a\ 在当前行下面插入文本。 
i\ 在当前行上面插入文本。 
c\ 把选定的行改为新的文本。 
d 删除,删除选择的行。 
s 查找替换,支持使用任意分隔符,
     用法格式s/pattern/替换内容/[替换标记],s@@@,s###(任意指定分隔符)
    替换标记:
    g:行内全局替换;p:显示替换成功的行;w /PATH/TO/SOMEFILE:将替换的行保存只文本
p 打印模板块的行。
w file 配合s将替换成功的行保存至文件。
g 配合s实现行内全局替换。
! 表示后面的命令对所有没有被选定的行发生作用。 
 = 打印当前行号码。
D 删除模板块的第一行。  
h 拷贝模板块的内容到内存中的缓冲区。 
H 追加模板块的内容到内存中的缓冲区。 
G 获得内存缓冲区的内容,并追加到当前模板块文本的后面。 
l 列表不能打印字符的清单。 
n 读取下一个输入行,用下一个命令处理新的行而不是用第一个命令。 
N 追加下一个输入行到模板块后面并在二者间嵌入一个新行,改变当前行号码。 
P (大写) 打印模板块的第一行。 
q 退出Sed。 
b lable 分支到脚本中带有标记的地方,如果分支不存在则分支到脚本的末尾。 
b file 从file中读行。 
t label if分支,从最后一行开始,条件一旦满足或者T,t命令,将导致分支到带有标号的命令处,或者到脚本的末尾。 
T label 错误分支,从最后一行开始,一旦发生错误或者T,t命令,将导致分支到带有标号的命令处,或者到脚本的末尾。 
  W file 写并追加模板块的第一行到file末尾。   
 # 把注释扩展到下一个换行符以前。
 

Input-File:可以是文件也可以是重定向内容 

 

练习及示例

sed只有通过反复练习让它成为一种能力,以下涉及的都是典型常用的示例和练习

<wiz_tmp_tag id="wiz-table-range-border" contenteditable="false" style="display: none;">



 



猜你喜欢

转载自www.cnblogs.com/allin2018/p/9072395.html