sed详细分析
【一、简单描述】
sed命令类似命令行的文本编辑器,以行为单位(见注1)。除非带命令i(in-place)否则源文件内容并不会被更新。
【二、使用】
【2.1、使用方式】
存在两种使用方式:
1、sed [options] 'command' file[files]
2、sed [options] -f 脚本文件 file[files]
【2.2、常用选项(options)】
。
-e(script 多次编辑):直接在指令模式上进行sed动作编辑
-f(file):将要使用的sed动作写入到一个文件内,-f filename将执行filename内的sed动作
-i(in--place):对[file]的处理直接写进文件
-r(regexp-extern):使用扩展性正则表达式
具体使用见常用命令说明。
【2.3、常用命令(command)】
常用命令及范例见下:
命令 |
用法、意义和范例 |
s(swap) |
用法:[指定地址]s/匹配字符/替换字符/替换标识(g.) 意义:替换匹配的内容 范例:替换所有的good为GOOD sed -n 's/good/GOOD/g'p test.txt (关于最后的替换标示(g)见后面说明,使用的测试文档test.txt见注3) |
d(delete) |
用法:[指定地址]d 意义:删除指定地址的行 范例:删除1-2行 sed '1,2d' test.txt (没加-n原因:被处理的两行被删除,所以加-n不会有输出,见注2) |
i\(insert) |
用法:[指定地址]i\添加内容 意义:在指定定制前方插入文本行 范例:在第一行和第二行前面添加start sed '1,2i\star' test.txt (没加n的原因不在赘述) |
a\(append) |
用法:[指定地址]i\添加内容 意义:在指定地址的后方插入文本行 范例:在第一行后面添加end sed '1a\end' test.txt |
c\(chose) |
用法:[指定地址]c\替换的内容 意义:将指定地址行替换成相应的文本 范例:将第一行替换成start sed '1c\start' test.txt |
p(print) |
用法:[指定地址]p 意义:在屏幕上输出指定地址内容 范例:打印前两行 sed -n '1,2'p test.txt |
= |
用法:[指定地址]= 意义:在屏幕上输出当前行号 范例:在每行前面一行打印行号 sed '1,$'= test.txt |
l(字母l,line) |
用法:[指定地址]l 意义:打印指定行,同时显示控制字符 范例:打印第一行,且显示控制字符(见后面说明) sed -n '1'l test.txt |
y |
用法:[指定地址]y/匹配字符(可以写成字符串形式)/替换字符/ 意义:替换指定地址的匹配字符 范例:替换全局(整个文本)g为G,o为O,d为D,!为? sed 'y/god!/GOD?/' test.txt |
n(next) |
用法:[指定地址]n 意义:读取指定地址的内容到缓存空间 范例: |
r(read) |
用法:[指定地址] r 指定文件 意义:读取指定文件的到指定地址之后 范例:读取test1.txt的内容到第二行后面 sed '2r test1.txt' test.txt |
w(write) |
用法:[指定地址]w 指定文件 意义:将指定地址的内容写入到指定文件(以write形式) 范例:将test.txt中的第二行写入到test1.txt sed '2w test1.txt' test.txt |
q(quit) |
用法:[指定地址]q 意义:读取到指定的行之后退出 范例:打印前两行(注意:没有加n表明处理到第二行就退出) sed '2'q test.txt |
关于替换标示的说明:
替换标示 |
意义和范例 |
n |
意义:(范围1-512),仅替换第n个被模式匹配的内容(在输入file未成功) 范例:替换第二次的空格为'@' echo "1 2 3 4" | sed 's/ /;/2' |
g |
意义:全局替换 范围:替换全部的good为GOOD sed 's/good/GOOD/g' test.txt |
【2.4、元字符集】(仅列出同标准的正则表达式的差异项)
同标准正则表达式差异的元字符集:
符号 |
意义和范例 |
\(..\) 注:即 (..)添加\为转义 |
意义:保存指定匹配的字符串,使用数字\n(n表示位置)可去除 范例:
|
& |
意义:指代匹配字符串 范例:替换good为==good== sed 's/good/==&==/g' test.txt |
\< |
用法:\<[指定字符串] 意义:匹配字符串的开始 范例:替换以ni为开头的字符串为==ni==..(该行剩余字符串) sed 's/\<ni/==&==/g' test.txt |
\> |
用法:[指定字符串]\> 意义:匹配字符串的结束 范例:替换以ni为结尾的字符串为==ni==..(该行剩余字符串) sed -n 's/ni\>/==&==/g'p test.txt |
【2.5、常规使用方式】
【2.5.1、分隔符说明】
上面的事例中我们都采用了'\'来充当分隔符,其实分割符可以按照中间的习惯设定,当然出现同分隔符一致的匹配字符的时候,
你需要添加转义字符'/'
例如:
1、使用其他分隔符:
替换当前路径的/home为空格:pwd | sed 's:/home::g'
2、遇见匹配的字符串同分隔符一样时:
替换当前路径的/home为空格:pwd | sed 's/\/home//g'
【2.5.2、使用组合表达式】
1、对每一行执行多个操作:采用-e (expression 见man)
范例:
如果有行有以he开头的打印,全局替换hello为HELLO,全局替换!为??
sed -ne '/\<he/'p -ne 's/hello/HELLO/g'p -ne 's/!/??/g'p test.txt
执行步骤分析:
上例中,我们特意在每条执行语句后面执行p,执行结果如下:
说明:
第一步:'/\<he/'p (找到以he开头那一行,将它打印出来)
第二步:'s/hello/HELLO/g'p (全局替换hello为HELLO)
第三步:'s/!/??/g'p (全局替换!为??)
由此我们看出执行的总体流程为:获取当前一行内容到缓存空间,根据表达式(express)对缓存空间的数据进行处理(见注2)。
上图中,标注的第三步(第三个表达式:'s/!/??/g'p)并不完整,完整的第三步应该对应为:
也正是由于第三步,
此时输出的才有这么多内容!
2、对同一行采用多个动作采用{} 加 ; 的方式
范例:找到以he为开头的行,替换该行的hello为HELLO并打印, 替换该行的!为??并打印
sed -n '/\<he/{s/hello/HELLO/;p;s/!/??/g;p}' test.txt
3、采用 | (管道)
管道的处理方式更类似与一个一个函数执行的情况
范例:替换good为GOOD并打印作为下一条执行命令的输入,替换!为??并打印
sed -n 's/good/GOOD/g'p test.txt | sed -n 's/!/??/g'p
总结:重点注意-e和{};区别
【2.5.3、提取特殊行】
1、提取奇数行:
sed -n '1~2'p test.txt
2、提取偶数行:
sed -n '2~2'p test.txt
【2.5.4、引用shell变量】
将一般使用的单引号'' 替换成 "",原因:双引号为弱转义,不会取出$变量的功能,而单引号为强转义,会把$视为一般符号表示。
范例:
步骤1、设置TEST变量:export TEST="good"
步骤2、调用TEST变量:sed -n "/$TEST/"p test.txt
【三、注释】
注1:模式空间和地址匹配
1、模式空间
可以简单的认为模式空间就是sed处理的缓存空间,以下图表示一个sed替换的执行过程:
在上图中的左侧为执行指令:
s/Unix/UNIX/ #将Unix转化为 UNIX
s/UNIX System/UNIX Operating System/ #将UNIX System 转化为 UNIX Operating System
右侧表示缓冲区的执行情况(也就是模式空间)。
2、地址匹配
以各行号来表示每行(地址定位),下表描述[指定范围空间]可采用的描述方式:
符号 |
意义和范例 |
1 |
意义:表示第一行 范例:屏幕仅输出test的第一行(n,p见后面分析) sed -n '1'p test |
2 |
意义:表示第二行 范例:屏幕仅输出test的第二行 sed -n '2'p test |
$ |
意义:表示最后一行 范例:屏幕仅输出test的最后一行 sed -n '$'p test |
1,2 |
意义:表示第一行到第二行 范例:屏幕仅输出test的第一行和第二行 sed -n '1,2'p test |
1,/匹配字符串/ |
意义:表示第一行到到/匹配字符串/ 范例:输出从首行到包含/good/i的行(此时首行不在/goog/的检索范围内) sed -n '1,/good/'p test.txt |
/匹配字符串/,/匹配字符串/! |
意义:不在匹配字符串的行 范例:首先找到两个字符串的匹配行,然后打印出不在这些行里面的行 本例中:假设有10行,匹配/ni/,/i/的为2-3行,所以打印的为1,4-10行。 sed -n '/ni/,/i/!'p test.txt |
注2:sed的执行流程
在使用sed处理文件的时候,如果没有添加-n将会在输出结果的时候同时输出源数据,比如:
源数据:
我们输出前两行
因此简单描述sed的处理流程:
1、读入新的一行内容到缓存空间(并打印到屏幕)
2、依次取指令匹配模式(也就是command)
3、重复处理完2(失败也是处理完),输出缓存行(这是加了p的缘故)的内容,回到1
4、处理直到1没有新的一行=>结束
注3:测试文本(test.txt)
内容:
good!
goood!
good!
nigood!
goodni!
hello!
e
i
good!
goo''od!
go??od!
goooood!
GOOD!
NICE!
【四、参考】
http://blog.jobbole.com/31026/
http://kodango.com/sed-and-awk-notes-part-2
http://mirrors.ustc.edu.cn/gnu/ (gnu镜像,sed源码)
sed详细分析的更多相关文章
- ZIP压缩算法详细分析及解压实例解释
最近自己实现了一个ZIP压缩数据的解压程序,觉得有必要把ZIP压缩格式进行一下详细总结,数据压缩是一门通信原理和计算机科学都会涉及到的学科,在通信原理中,一般称为信源编码,在计算机科学里,一般称为数据 ...
- 1125MySQL Sending data导致查询很慢的问题详细分析
-- 问题1 tablename使用主键索引反而比idx_ref_id慢的原因EXPLAIN SELECT SQL_NO_CACHE COUNT(id) FROM dbname.tbname FORC ...
- LinkedList详细分析
一.源码解析1. LinkedList类定义2.LinkedList数据结构原理3.私有属性4.构造方法5.元素添加add()及原理6.删除数据remove()7.数据获取get()8.数据复制clo ...
- android ListView 九大重要属性详细分析、
android ListView 九大重要属性详细分析. 1.android ListView 一些重要属性详解,兄弟朋友可以参考一下. 首先是stackFromBottom属性,这只该属性之后你做好 ...
- C语言中的static 详细分析
转自:http://blog.csdn.net/keyeagle/article/details/6708077/ google了近三页的关于C语言中static的内容,发现可用的信息很少,要么长篇大 ...
- Linux内核OOM机制的详细分析(转)
Linux 内核 有个机制叫OOM killer(Out-Of-Memory killer),该机制会监控那些占用内存过大,尤其是瞬间很快消耗大量内存的进程,为了 防止内存耗尽而内核会把该进程杀掉.典 ...
- Android-Native-Server 启动和注册详细分析
Android-Native-Server 启动和注册详细分析 以mediaService为实例来讲解: mediaService的启动入口 是一个 传统的 main()函数 源码位置E:\ ...
- px,dp,dip,sp,in,mm,pt详细分析
px,dp,dip,sp,in,mm,pt详细分析 px :(pixels),屏幕的像素点,不同的设备显示效果相同,一般我们HVGA代表320x480像素,这个用的比较多. dip :(devi ...
- Http Pipeline详细分析(下)
Http Pipeline详细分析(下) 文章内容 接上面的章节,我们这篇要讲解的是Pipeline是执行的各种事件,我们知道,在自定义的HttpModule的Init方法里,我们可以添加自己的事件, ...
随机推荐
- [问题2015S07] 复旦高等代数 II(14级)每周一题(第八教学周)
[问题2015S07] 设 \(A\) 为 \(n\) 阶复方阵, 证明: 存在 \(n\) 阶非异复对称阵 \(S\), 使得 \(A'=S^{-1}AS\), 即 \(A\) 可通过非异复对称阵 ...
- [问题2015S14] 复旦高等代数 II(14级)每周一题(第十五教学周)
[问题2015S14] 设 \(J=\begin{pmatrix} 0 & I_n \\ -I_n & 0 \\ \end{pmatrix}\), \(A\) 为 \(2n\) 阶实 ...
- [问题2014S10] 解答
[问题2014S10] 解答 先证明一个简单的引理. 引理 设 \(\lambda_0\) 是 \(n\) 阶方阵 \(A\) 的特征值, 则对任意的正整数 \(k\), Jordan 块 \(J ...
- D3.js 力导向图
花了大半天看了一个八十几行的代码..心累 力导向图是之前就有画过很多次的东西,但是这次的代码看上去很陌生,然后发现是D3更新了4.0.... 先贴代码 var svg = d3.select(&quo ...
- Java vs. C#
Java Program Structure C# package hello; public class HelloWorld { public static void main(String ...
- JavaScript学习笔记及知识点整理_3
1.js的事件冒泡及阻止方法:事件冒泡的概念:在一个对象上触发某类事件(比如单击onclick事件),如果此对象定义了此事件的处理程序,那么此事件就会调用这个处理程序,如果没有定义此事件处理程序或者事 ...
- linux下tar.gz、tar、bz2、zip等解压缩、压缩命令小结
Linux下最常用的打包程序就是tar了,使用tar程序打出来的包我们常称为tar包,tar包文件的命令通常都是以.tar结尾的.生成tar包后,就可以用其它的程序来进 行压缩了,所以首先就来讲讲ta ...
- Error: Cannot find a valid baseurl for repo: base
解决方法如下(修改dns配置) vi /etc/resolv.conf 在此文件最后加入:nameserver 8.8.8.8 如果没有vi编辑器可用: echo "nameserver 8 ...
- django"动态网页","动态url","调试方法"
一.动态网页 其实只是每次刷新时,获取最新时间而已 1.urls.py from django.conf.urls import patterns, url, include urlpatterns ...
- JDK注解替代Hibernate的Entity映射
1.在entity(实体类)模块中使用注解 1_1.注解的位置出现在 [类定义的前面] 和 [属性的get方法前面] [属性的get方法前面] Java代码: package app.entity; ...