概念:
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:可以是文件也可以是重定向内容
<wiz_tmp_tag id="wiz-table-range-border" contenteditable="false" style="display: none;">