【一、简单描述】

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表示位置)可去除

范例:

  1. 单个参数的情况

    保存匹配字符good的前面两个字符go,全局替换匹配的字符串为go(\1:指代go)--istest

    sed 's/\(go\)od/\1--istest/g' test.txt

  2. 两个参数

    分别保存匹配字符go??dd的go和od,去掉中间的两个??将\1\2连接在一起成为good

    sed 's/\(go\)??\(od\)/\1\2/g' test.txt

    多个的则不在赘述

&

意义:指代匹配字符串

范例:替换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详细分析的更多相关文章

  1. ZIP压缩算法详细分析及解压实例解释

    最近自己实现了一个ZIP压缩数据的解压程序,觉得有必要把ZIP压缩格式进行一下详细总结,数据压缩是一门通信原理和计算机科学都会涉及到的学科,在通信原理中,一般称为信源编码,在计算机科学里,一般称为数据 ...

  2. 1125MySQL Sending data导致查询很慢的问题详细分析

    -- 问题1 tablename使用主键索引反而比idx_ref_id慢的原因EXPLAIN SELECT SQL_NO_CACHE COUNT(id) FROM dbname.tbname FORC ...

  3. LinkedList详细分析

    一.源码解析1. LinkedList类定义2.LinkedList数据结构原理3.私有属性4.构造方法5.元素添加add()及原理6.删除数据remove()7.数据获取get()8.数据复制clo ...

  4. android ListView 九大重要属性详细分析、

    android ListView 九大重要属性详细分析. 1.android ListView 一些重要属性详解,兄弟朋友可以参考一下. 首先是stackFromBottom属性,这只该属性之后你做好 ...

  5. C语言中的static 详细分析

    转自:http://blog.csdn.net/keyeagle/article/details/6708077/ google了近三页的关于C语言中static的内容,发现可用的信息很少,要么长篇大 ...

  6. Linux内核OOM机制的详细分析(转)

    Linux 内核 有个机制叫OOM killer(Out-Of-Memory killer),该机制会监控那些占用内存过大,尤其是瞬间很快消耗大量内存的进程,为了 防止内存耗尽而内核会把该进程杀掉.典 ...

  7. Android-Native-Server 启动和注册详细分析

    Android-Native-Server 启动和注册详细分析     以mediaService为实例来讲解: mediaService的启动入口 是一个 传统的  main()函数 源码位置E:\ ...

  8. px,dp,dip,sp,in,mm,pt详细分析

    px,dp,dip,sp,in,mm,pt详细分析 px   :(pixels),屏幕的像素点,不同的设备显示效果相同,一般我们HVGA代表320x480像素,这个用的比较多. dip  :(devi ...

  9. Http Pipeline详细分析(下)

    Http Pipeline详细分析(下) 文章内容 接上面的章节,我们这篇要讲解的是Pipeline是执行的各种事件,我们知道,在自定义的HttpModule的Init方法里,我们可以添加自己的事件, ...

随机推荐

  1. Javasocket1

    转载自http://www.cnblogs.com/linzheng/archive/2011/01/23/1942328.html java socket编程 一,网络编程中两个主要的问题 一个是如 ...

  2. Java 中文字符串编码之GBK转UTF-8

    写过两篇关于编码的文章了,以为自己比较了解编码了呢?! 结果今天又结结实实的上了一课. 以前转来转去解决的问题终归还是简单的情形.即iso-8859-1转utf-8,或者iso-8859-1转gbk, ...

  3. react项目组件化思考

    三个原则 single store render from top immutable data single store,便于组件之间通信. render from top,因为store就一个,每 ...

  4. 转 猫都能学会的Unity3D Shader入门指南(二)

    猫都能学会的Unity3D Shader入门指南(二) 关于本系列 这是Unity3D Shader入门指南系列的第二篇,本系列面向的对象是新接触Shader开发的Unity3D使用者,因为我本身自己 ...

  5. jquery截图插件的使用

    首先感谢http://www.htmleaf.com/Demo/201504211717.html这款插件. 使用之初,对于插件的结构很是糊涂,首先文件的核心是cropper.js,其次才是mian. ...

  6. 被table单元格colspan属性折磨了

    基础知识不牢固,被colspan折磨了很长时间 table里面的td使用colspan前提条件是所跨的单元格宽度必须一样,不然显示效果会是属性不起作用或直接导致表格变形,下面的例子可以看出效果 < ...

  7. html5获取经纬度,百度api获取街区名,并使用JS保存进cookie

    引用js<script type="text/javascript" src="http://api.map.baidu.com/api?v=2.0&ak= ...

  8. 在node.js中使用mongose模块

    对象与文档相对应 创建项目目录,用root进入 # mkdir /home/test/part9/ 直接# npm install mongoose,报错如下 ../node_modules/nan/ ...

  9. 【bzoj1098】办公楼

    [bzoj1098]办公楼 题意 FGD开办了一家电话公司.他雇用了N个职员,给了每个职员一部手机.每个职员的手机里都存储有一些同事的电话号码.由于FGD的公司规模不断扩大,旧的办公楼已经显得十分狭窄 ...

  10. Google Analytics与百度统计原理

    Google Analytics与百度统计的统计数据都是有差异的,而且差异非常大,其根本原因在于数据统计的原理和机制是不同的.下面分享一下两位博友李鑫和赵高欣对Google Analytics与百度统 ...