Linux文本处理三剑客之sed
来源:互联网 发布:淘宝网男包包 编辑:程序博客网 时间:2024/06/05 10:45
sed简介
sed全称Stream Editor,顾名思义为流编辑器,也习惯叫行编辑器,处理文本的方式为按行至上而下读取,匹配,处理并显示或者做其它处理,直到文件末尾。其原理图如下:
命令运行会在内存开辟模式空间和保持空间2个空间用来处理文本内容,流程如下:
1. 读取文本第一行内容至模式空间
2. 当内容没有匹配时,默认会输出,当有匹配时则进行编辑操作(修改,替换,删除,追加,显示等)
3. 处理第一行后,将内容输出,再对第二行处理直到文本结束
模式空间和保存空间
默认情况下,sed是将输入内容一行一行进行处理的,如下例子
sed ‘1,$p’ /etc/passwd
处理过程:sed会一行一行的读入/etc/passwd文件,查看每行是否匹配定址条件(1,$),如果条件匹配,就将行内容放入模式空间,并打印(p命令)。由于文本流本身的输出,而模式空间内容又被打印一遍,所以这个命令最后会将每一行都显示2遍,默认情况下,sed程序在所有的脚本指令执行完毕后,将自动打印模式空间中的内容,这会导致p命令输出相关行两遍,-n选项可以屏蔽自动打印。
模式空间(pattern space)
用于缓存要处理的内容,是sed处理最核心的缓存空间,所有要处理的行内容都会复制进这个空间再进行修改,或根据需要显示。默认sed不会修改原文件本身内容,只修改模式空间内容。
保持空间(hold space)
除了模式空间以外,sed还实现了另一个内容缓存空间,叫保持空间。可以理解这个空间跟模式空间一样,也就是一段内存空间,一般情况下不用,使用相关参数进行使用。
语法
sed [OPTION] 'script' FILE...
script中有变量引用时用双引号
常用选项
-n
: 不输出模式空间中的内容
-r
: 使用扩展正则表达式
-e
: 可以使用多个命令脚本进行操作
-f sed_script
: 从指定的文本中读取处理脚本
-i
: 直接编辑原文件,默认不对原文件进行操
script
script由地址定界
和编辑命令
组成,二者间不能有空格,如:’2,5d’ tips
:可能还含有模式匹配/part/g等 修饰符,如以下例子:
# 去除文本中的html标签echo "This <b> is </b> an <i>example</i>." | sed -e 's/<[^>]*>//g' #g属于修饰符
地址定界
空地址
:全文
m
:指定第m行
$
:最后一行
/pattern/
:被此模式匹配到的每一行m,n
:从第m行到n行
m,+n
:从第m行到m+n行
m,/pattern/
:从第m行到第一次模式匹配到的行
/pat1/,/pat2/
:第一次被模式1匹配的行到第一次被模式2匹配到的行1~2
:奇数行
2~2
:偶数行
编辑命令
对地址定界下匹配到的内容执行的操作
d
:删除匹配到的行
p
:打印模式空间中的内容tips:默认情况下是把“模式空间”中的内容全部进行显示,所以其显示的结果是“默认的显示内容+p的内容”,即匹配的行显示2次,通常与-n选项一起使用,表示只显示匹配到的行
a \text
:append,在匹配到的行之后追加text,支持\n实现多行插入
i \text
:insert,在匹配到的行之前追加text
c \text
:change,把匹配到的行和给定的文本进行交换
w file
:将匹配到的内容另存到指定的文件中
r file
:将读取指定的文件内容到匹配的行处(如果指定文件为多行时,追加到匹配行之后)
=
:为匹配到的行在上一行添加行号 ,如sed ‘=’ /etc/fstab
!
:条件取反,格式为地址定界!编辑命令,如’5!d’表第5行不删
s/pattern/str/[修饰符]
:查找替换,常用s@@@和s###[修饰符]:
g
全局,默认只匹配每一行的第一个
i
不区分大小写
p
显示替换成功的行
后向引用
:\(**\)
,\1,\2...
对应括号内容
&
表示引用匹配到整个文本
y/inchars/outchars/
:全局转换命令,会进行inchars和outchars的一对一转换
实例
# 打印第二行到第一次以#开头的行 sed -n '2,/^#/p' /tmp/file1 # 去除文本中的html标签echo "This <b> is </b> an <i>example</i>." | sed -e 's/<[^>]*>//g' # 全文每行后添加2行内容 sed 'a \new line\another' /tmp/file2 # 删除文件中的空白行sed -r '/^[[:space:]]*$/d' file3 # file4中第一次以#开头的行到第一次以ID结尾的行写入sed.txt中 sed -n '/^#/,/ID$/w sed.txt' file4 # 取基名,包括有无最后‘/’的情况 echo "/etc/rc.d/" | sed -r 's@^/.*/([^/]+)/?@\1@g' # 取目录名,(将基名删除)echo '/etc/rc.d/init.d/function' | sed -r 's@[^/]+/?$@@'
高级命令
所谓的高级就是用上图示中的保持空间的功能,可以实现模式空间与保持空间中的内容互相替换,追加,删除等操作,以得到各种匪夷所思的结果,强大到没朋友…真正熟练使用不是一朝一夕的事了
h
:模式空间–>覆盖–>保持空间
H
:模式空间–>追加–>保持空间(加在原有内容之后)
g
:保持空间–>覆盖–>模式空间
G
:保持空间–>追加–>模式空间(加在原有内容之后)
x
:模式空间<–交换–>保持空间
d
:删除模式空间中的内容
D
:如果模式空间中的内容为多行时,删除模式空间中的第一行
n
:读取匹配到的行的下一行到模式空间中(覆盖原内容)
N
:读取匹配到的行的下一行到模式空间中(追加在原内容之后)
tips:多处命令间用分号隔开,实现多点编辑,追加或覆盖操作时原空间内容依然存在
sed -n 'n;p' file # 显示偶数行sed '/^$/d;G' file # 删除文件中空白行,再为每行后添加空白行(保持空间为空追加模式空间即加空白行)sed -r '$!N;$!D' file # 取出最后两行sed '1!G;h;$!d' file # 逆序显示
- Linux文本处理三剑客之sed
- Linux文本处理三剑客之sed
- Linux 文本处理三剑客之sed命令详解
- Linux文本处理三剑客之sed命令
- 文本处理三剑客之sed
- 文本处理三剑客之sed
- 文本三剑客之sed
- 文本三剑客之sed
- 文本三剑客之sed
- linux文本处理三剑客(二):sed命令详解
- 02-shell文本处理三剑客之sed
- 第七章 Shell文本处理三剑客之sed
- 第七章 Shell文本处理三剑客之sed
- linux文本处理三剑客之grep
- Linux文本处理三剑客之awk
- linux文本处理三剑客之grep
- linux文本处理三剑客之grep
- Linux 基础命令(八)—— 文本处理三剑客之sed
- 第十五课 插入数据
- 信号:signal以及sigaction
- ubuntu下安装和配置最新版JDK8傻瓜教程
- 改变HashMap中的值得问题
- zabbix
- Linux文本处理三剑客之sed
- 几个框架的责任链设计模式简析
- Python Socket 编程
- Android输入系统概述
- 【Android】EventBus 3.0 源码分析
- HOJX-1004
- UVA 442
- java实现二叉树的创建和各种遍历操作
- InputManagerService服务的初始化