1、什么是sed

sed命令是一个流线式、非交互式编辑器,可以实现在vi等编辑器中一样的编辑效果。
 

2、sed的工作原理

模式空间(pattern space)
sed一次处理一行文本(或输入),并把输出送往屏幕或重定向到文件。
sed把当前处理的行存储在临时缓冲区中,称为模式空间。
一旦完成对模式空间中的行的处理,也就是执行完这一行中的sed命令,模式空间中的行就被送往屏幕(除非是删除行命令或者打印到打印机)。
行被处理完后,就被移出模式空间,程序接着读入下一行,处理、显示、移出......直到文件的最后一行处理完以后sed结束。
 
保持缓冲区(holding buffer)
h命令将模式空间中的行复制到一个叫保持缓冲区的特殊缓冲区中。
G命令将保持缓冲区中的行放回模式空间中,且追加到模式空间中已有行的末尾。
g命令将保持缓冲区中的行放回模式空间中,且替换模式空间中已有的行。
x命令互换模式空间和保持缓冲区的内容。
 
注意:保持缓冲区一次只能容纳一行。

3、定址

通过定址来判断哪一行希望被编辑。
可以通过数字、正则表达式或者二者结合的方式来定址。
在没有定址的情况下,sed处理输入文件的所有行。
$sed '1,3d' myfile
$sed -n '/John/p'

4、命令和选项

命令:
a\在当前行后面加入一行或者文本
i\在当前行前面插入一行
d从模式空间中删除匹配的行
p打印匹配模板的行
r file从file中读行
h拷贝模板块的内容到内存中的缓冲区
G命令将保持缓冲区中的行放回模式空间中,且追加到模式空间中已有行的末尾
g命令将保持缓冲区中的行放回模式空间中,且替换模式空间中已有的行
q退出sed
!表示后面的命令对所有没有被选定的行发生作用
s/re/string用string替换正则表达式re匹配的字符串
 
替换标记:
g行内全面替换
w写入文件
 
选项:
-e command允许多点编辑
--expression command允许多点编辑
-n取消默认输出
 

5、sed支持的特殊元字符

&保存搜索字符用来替换其他字符s/love/&/将love替换为love

6、sed脚本

就是一个包含sed命令清单的文件,好处是不必担心与shell命令行的交互问题,不需要引用sed命令来防止它被shell解释。
sed对于脚本中输入的命令非常挑剔,在命令的末尾不能有任何空白或者文本。
$sed -f script.sh datafile

7、实例

1)p命令
$sed -n '/north/p' datafile//-n和p命令一般一块使用,用来只打印匹配模板的行,取消默认打印模式空间中的所有行的行为
 
2)删除:d命令
$sed '3d' datafile//删除第3行
$sed '3,$' datafile//删除第3到最后一行
 
3)替换:s命令
$sed 's/west/north/g' datafile //如果没有g标志,则只替换第1个匹配的
$sed -n 's/west/north/gp' datafile //-n和p命令只打印发生替换的行
$sed 's/[0-9][0-9]$/&.5/' datafile//&表示替换字符串中被找到的部分
$sed -n 's/\(Mar\)got/\1ianne/p' datafile//标记
$sed 's#west#east#g'//s后面的字符是分隔搜索字符串和替换字符串的字符,默认是/,但在s命令情况下可以改变,无论什么字符紧跟着s命令被认为是新的分隔符。
 
4)选定行的范围:,
$sed -n '/west/,/east/p' datafile//打印west和east之间的行。如果west未找到,则不打印任何行;如果east未找到,则打印west到末尾的所有行。
$sed '/west/,/east/s/$/VAR*/' datafile
 
5)多点编辑:e命令
$sed -e '1,3d' -e 's/Hemenway/Jones/' datafile//多个命令是在同一行执行,命令的执行顺序影响命令的结果。
$sed --expression='s/TB/Tobias/' --expression='/north/d' datafile
 
6)从文件读入:r命令
$sed '/Suan/r newfile' datafile//从文件读入的内容显示在所有匹配行的后面
 
7)写入文件:w命令
$sed -n ''/north/w newfile' datafile//将模板匹配的行写入文件
 
8)追加命令:a命令
$sed -n '/^north/a\
----->The North Sales Distribute Has Moved<------------' datafile
 
$sed -n '/^north/a\
----->The North Sales Distribute Has Moved<------------\
----->The North Sales Distribute Has Moved<------------' datafile//追加多行,除了最后一行,每一行需要加\
 
9)插入:i命令
$sed -n '/^north/i\
----->The North Sales Distribute Has Moved<------------' datafile
 
$sed -n '/^north/i\
----->The North Sales Distribute Has Moved<------------\
----->The North Sales Distribute Has Moved<------------' datafile//在匹配行之前插入多行,除了最后一行,每一行需要加\
 
10)下一个:n命令
$sed '/eastern /{n; s/AM/Archie/; }' datafile
 
11)变形:y命令
$sed '1,3y/abcdefg/ABCDEFG/' datafile//将a-g变换为大写,定址部分可使用正则表达式
 
12)退出:q命令
$sed '5q' datafile//打印第5行之后退出
$sed '/Lewis/{ s/Lewis/Jooseph/;q }//{ }执行多个命令,分号分隔,可嵌套
 
13)保持和获取:h命令、G命令、g命令
$sed -e '/northeast/h' -e '$G' datafile//将含northeast的行追加到文件的最后一行
$sed -e '/WE/{h, d; }' -e '/CT/{G;}' datafile//将包含WE的行移动到包含CT的行的后面
$sed -e '/northeast/h' -e '$g' datafile//将含northeast的行替换文件的最后一行
 
14)保持和互换
$sed -e '/particia/h' -e '/Margot/x' datafile//包含Margot的行被包含particia的行替换了
 
15)其它实例
查找包含字符串的行
#sed -n '/^vmm_read_interval/p' log2.txt >avg2.txt                  //-n和/p命令一般配合使用,只打印找到的行
 
删除文件中的空行
#sed '/^$/d' file
 
针对已查找到的内容进行替换
#sed 's/^[1-9]/\n&/g' 2.srt>3.srt    //在以数字开头的行前加一个空行
#sed 's/[0-9][0-9]$/&.5/' datafile     //以两位数结尾行加.5
#sed 's/address/&#/g' /etc/network/interfaces       //在所有address后加#
#sed 's/:.*[0-9]$g'          将冒号以及冒号后的数字替换成空
注意:
1)&符号替换字符串中被找到的部分,不是指找到部分所在的整行
2)/g表示命令作用的范围为整行,即对一行中所有找到的内容执行相应动作,否则只针对第一次找到的内容
 
多点编辑
#sed -e 's/address/#&/' -e 's/netmask/#&/' -e 's/gateway/#&/g' -e 's/^##//g' $NET_CONFIG_FILE.bak >$NET_CONFIG_FILE 
//首先在所有address,netmask,gateway单词前加一个#,再针对以两个#开头的行中将两个#去掉,从前往后依次执行。
 
合并两行
1) 先将每一行的开头用一特殊的字符串标记,例如BBBB
2) 将需要合并的行的前一行末尾用一特殊的字符串标记,例如AAAA
3) 用tr删除所有回车换行符\n,则所有行合成一行。真正需要合并的行之间会存在AAAABBBB的标记,需要换行的地方有BBBB的标记
4) 将所有AAAABBBB替换成空
5) 将所有BBBB替换成‘\n   ’
具体程序如下:
sed '1,$s/^/BBBB/g' $1.1 >$1.2
sed '/[^。)?”!〗]$/s/$/AAAA/' $1.2 >$1.3
sed -n '1,$p' $1.3|tr -d '\n'>$1.4
sed 's/AAAABBBB//g' $1.4>$1.5
sed 's/BBBB/\n    /g' $1.5>$1.6
sed 's/AAAA//g' $1.6>$1.7
cp $1.7 $1.txt
echo "finished."
rm $1.[0-9]*
 
将中英文字幕文件分成中文和英文两个字幕文件
$sed '/^[0-9][0-9]:/{n;d}' 1.srt >2.srt
$sed '/^[0-9][0-9]:/{n;n;d}' 1.srt >3.srt
 

=-=-=-=-=
Powered by Blogilo

sed的用法的更多相关文章

  1. linux中sed的用法【转】

    sed命令行格式为:         sed [-nefri]  ‘command’  输入文本/文件 常用选项:        -n∶取消默认的输出,使用安静(silent)模式.在一般 sed 的 ...

  2. sed命令用法详解

    sed命令用法 sed是一种流编辑器,它是文本处理中非常有用的工具,能够完美的配合正则表达式使用,功能不同凡响.处理时,把当前处理的行存储在临时缓冲区中,称为『模式空间』(pattern space) ...

  3. Linux中sed的用法实践

    Linux中sed的用法实践 参考资料:https://www.cnblogs.com/emanlee/archive/2013/09/07/3307642.html http://www.fn139 ...

  4. SED命令用法整理

    sed '/Started/'q  匹配到Started字符串则退出sed命令 sed '/Started/{/in/q}'  同时匹配到Started和in两个字符时则退出sed命令 ------- ...

  5. [转载]linux中sed的用法

    转自:http://www.cnblogs.com/emanlee/archive/2013/09/07/3307642.html sed命令行格式为:         sed [-nefri]  ‘ ...

  6. Linux中Sed的用法

    Linux中Sed的用法 sed是一个很好的文件处理工具,本身是一个管道命令,主要是以行为单位进行处理,可以将数据行进行替换.删除.新增.选取等特定工作,下面先了解一下sed的用法sed命令行格式为: ...

  7. sed高级用法:模式空间(pattern space)和保持空间(hold space)

    摘自:https://blog.csdn.net/ITsenlin/article/details/21129405 sed高级用法:模式空间(pattern space)和保持空间(hold spa ...

  8. 正则表达式,sed简单用法

      一. 正则表达式 1. 常见的正则表达式字符 [] 匹配字符集 grep "bl[lo]g" oldboy.txt 表示字符‘l’或者‘o’都可匹配 * 重复前面字符任意次 g ...

  9. Linux sed命令用法

    概述 sed命令是一个面向字符流的非交互式编辑器,不允许用户与它进行交互操作.sed是以行为单位处理文本内容的.在shell中,可以批量修改文本内容. 用法 sed [选项] [动作] 选项与参数:- ...

  10. linux之sed的用法

    sed是一个很好的文件处理工具,本身是一个管道命令,主要是以行为单位进行处理,可以将数据行进行替换.删除.新增.选取等特定工作,下面先了解一下sed的用法sed命令行格式为:         sed ...

随机推荐

  1. Less与Sass

    less 1.变量    声明变量:@变量名:变量值 使用变量:@变量名 >>>Less中变量的类型 ①数字类:1 100px ②字符串:无引号字符串[red] 有引号字符串[&qu ...

  2. 记录JavaFx中非常重要的细节,入门了也未必知道

    title: 记录JavaFx中非常重要的细节 JavaFx中有一些疑难杂症,或许你以为你掌握了JavaFx,但是也未必知道我所说的这些问题和解决方案,如果有帮助到你的,可以加群最大最活跃的JavaF ...

  3. shell入门笔记1:执行方式、运行方式、变量、替换

    说明: 本文是关于http://c.biancheng.net/cpp/shell/的相关笔记 shell的两种执行方式 交互式(interactive) 解释执行用户的命令,用户输入一条命令,She ...

  4. 成熟的C#网络通信框架介绍——ESFramework通信框架

    (转自:http://www.cnblogs.com/zhuweisky/archive/2010/08/12/1798211.html) ESFramework通信框架是一套性能卓越.稳定可靠.强大 ...

  5. Oracle的substr函数

    一.Substr函数 substr(目标字符串,开始位置,长度) 注意:这里第三个参数:长度,相当于物理中的标量,没有方向性,所以不能用负值.虽然不报错,但是选择不出任何值出来(欢迎指正) 开始位置可 ...

  6. 深入理解IOC

    1. IoC理论的背景 我们都知道,在采用面向对象方法设计的软件系统中,它的底层实现都是由N个对象组成的,所有的对象通过彼此的合作,最终实现系统的业务逻辑. 图1:软件系统中耦合的对象 如果我们打开机 ...

  7. CI 图片上传路径问题的解决

    很久没有用CI了,新公司需要用ci ,图片上传的功能,我都搞半天,伤心 1. 要看源码,upload.php里do_upload()是上传的主要函数. public function do_uploa ...

  8. python通过http请求发送soap报文进行webservice接口调用

    最近学习Python调用webservice 接口,开始的时候主要采用suds 的方式生产client调用,后来发现公司的短信接口采用的是soap报文来调用的,然后开始了谷歌,最后采用httplib ...

  9. VR的发展历程-VR全景智慧城市

    从1962年有第一台VR开始,到2014年Oculus被Facebook收购为止,VR经历了一个非常漫长的过程.从鲜为人知,到被广泛认识,逐渐走进我们生活.这就是VR形成的时代.在这个时代里,VR设备 ...

  10. Node.js入门以及第一个helloworld程序

    1.概念:简单的说 Node.js 就是运行在服务端的 JavaScript.学之前需要明白Node.js是无法挑战jsp.php或者asp这种老牌网站的地位的,是永远不会出现在证券.金融这种领域的. ...