sed(转)
第一部分:sed基础
| 命令 | 功能 |
| a\ | 在当前行后添加一行或多行。多行时除最后一行外,每行末尾需用“\”续行 |
| c\ | 用此符号后的新文本替换当前行中的文本。多行时除最后一行外,每行末尾需用”\”续行 |
| i\ | 在当前行之前插入文本。多行时除最后一行外,每行末尾需用”\”续行 |
| d | 删除行 |
| h | 把模式空间里的内容复制到暂存缓冲区 |
| H | 把模式空间里的内容追加到暂存缓冲区 |
| g | 把暂存缓冲区里的内容复制到模式空间,覆盖原有的内容 |
| G | 把暂存缓冲区的内容追加到模式空间里,追加在原有内容的后面 |
| l | 列出非打印字符 |
| p | 打印行 |
| n | 读入下一输入行,并从下一条命令而不是第一条命令开始对其的处理 |
| q | 结束或退出sed |
| r | 从文件中读取输入行 |
| ! | 对所选行以外的所有行应用命令 |
| s | 用一个字符串替换另一个 |
| g | 在行内进行全局替换 |
| w | 将所选的行写入文件 |
| x | 交换暂存缓冲区与模式空间的内容 |
| y | 将字符替换为另一字符(不能对正则表达式使用y命令) |
| 选项 | 功能 |
| -e | 进行多项编辑,即对输入行应用多条sed命令时使用 |
| -n | 取消默认的输出 |
| -f | 指定sed脚本的文件名 |
3)正则规则
| 元字符 | 功能 | 示例 |
| ^ | 行首定位符 | /^my/ 匹配所有以my开头的行 |
| $ | 行尾定位符 | /my$/ 匹配所有以my结尾的行 |
| . | 匹配除换行符以外的单个字符 | /m..y/ 匹配包含字母m,后跟两个任意字符,再跟字母y的行 |
| * | 匹配零个或多个前导字符 | /my*/ 匹配包含字母m,后跟零个或多个y字母的行 |
| [] | 匹配指定字符组内的任一字符 | /[Mm]y/ 匹配包含My或my的行 |
| [^] | 匹配不在指定字符组内的任一字符 | /[^Mm]y/ 匹配包含y,但y之前的那个字符不是M或m的行 |
| \(..\) | 保存已匹配的字符 | 1,20s/\(you\)self/\1r/ 标记元字符之间的模式,并将其保存为标签1,之后可以使用\1来引用它。最多可以定义9个标签,从左边开始编号,最左边的是第一个。此例中,对第1到第20行进行处理,you被保存为标签1,如果发现youself,则替换为your。 |
| & | 保存查找串以便在替换串中引用 | s/my/**&**/ 符号&代表查找串。my将被替换为**my** |
| \< | 词首定位符 | /\<my/ 匹配包含以my开头的单词的行 |
| \> | 词尾定位符 | /my\>/ 匹配包含以my结尾的单词的行 |
| x\{m\} | 连续m个x | /9\{5\}/ 匹配包含连续5个9的行 |
| x\{m,\} | 至少m个x | /9\{5,\}/ 匹配包含至少连续5个9的行 |
| x\{m,n\} | 至少m个,但不超过n个x | /9\{5,7\}/ 匹配包含连续5到7个9的行 |
|
1
2
3
4
5
6
7
8
9
10
11
|
cricode>>cat sed.txt
#This is a sed command test file
Hello,world hello,world
if linux command www.cricode.com
welcome to cricode
cricode>>sed '/Hello/p' sed.txt
#This is a sed command test file
Hello,world hello,world
Hello,world hello,world
if linux command www.cricode.com
welcome to cricode
|
文件中包含Hello的行被输出了两次。
|
1
2
|
cricode>>sed -n '/Hello/p' sed.txt
Hello,world hello,world
|
实例2. d命令
|
1
2
3
|
cricode>>sed '1,2d' sed.txt
if linux command www.cricode.com
welcome to cricode
|
删除最后一行
|
1
2
3
4
|
cricode>>sed '$d' sed.txt
#This is a sed command test file
Hello,world hello,world
if linux command www.cricode.com
|
删除包含字符串cricode的行
|
1
2
3
|
cricode>>sed '/cricode/d' sed.txt
#This is a sed command test file
Hello,world hello,world
|
删除以com字符串结尾的行
|
1
2
3
4
|
cricode>>sed '/com$/d' sed.txt
#This is a sed command test file
Hello,world hello,world
welcome to cricode
|
实例3. S命令
|
1
2
3
4
5
|
cricode>>sed 's/world/WORLD/' sed.txt
#This is a sed command test file
Hello,WORLD hello,world
if linux command www.cricode.com
welcome to cricode
|
可以发现Hello,WORLD hello,world 中只有第一个world被替换了。
|
1
2
3
4
5
|
cricode>>sed 's/world/WORLD/g' sed.txt
#This is a sed command test file
Hello,WORLD hello,WORLD
if linux command www.cricode.com
welcome to cricode
|
整行替换,将全文中包含特定单词的行替换成其他字符串。
|
1
2
3
4
5
|
cricode>>sed 's/.*world/this is a replace line/' sed.txt
#This is a sed command test file
this is a replace line
if linux command www.cricode.com
welcome to cricode
|
实例4. e选项
|
1
2
3
|
cricode>>sed -e '1,2d' -e 's/cricode/CRICODE/' sed.txt
if linux command www.CRICODE.com
welcome to CRICODE
|
上述为sed命令使用选项-e进行多重编辑后得到的结果。第一重编辑删除第1、2行。第二重编辑将第1、2行外的所有包含cricode替换为大写CRICODE。因为是逐行进行这两项编辑(即这两个命令都在模式空间的当前行上执行),所以编辑命令的顺序会影响结果。
|
1
2
3
4
5
6
7
|
cricode>>sed '/cricode/r sed1.txt' sed.txt
#This is a sed command test file
Hello,world hello,world
if linux command www.cricode.com
###This is comment information!!!!!!!!!!!!!
welcome to cricode
###This is comment information!!!!!!!!!!!!!
|
实例6. w命令
|
1
2
3
4
5
6
7
8
|
cricode>>sed '/cricode/w tmp.txt' sed.txt
#This is a sed command test file
Hello,world hello,world
if linux command www.cricode.com
welcome to cricode
cricode>>cat tmp.txt
if linux command www.cricode.com
welcome to cricode
|
上述命令将sed.txt文件中包含模式cricode的行内容写入到tmp.txt
实例7.a\命令
a\命令将添加新文本到文件中当前行(即读入模式缓冲区中的行)的后面。所追加的文本行位于sed命令的下方另起一行。如果要追加的内容超过一行,则每一行都必须以反斜线结束,最后一行除外。最后一行将以引号和文件名结束。
在包含hello的行后插入一行内容:kidding??
|
1
2
3
4
5
6
|
cricode>>sed '/hello/a\kidding???' sed.txt
#This is a sed command test file
Hello,world hello,world
kidding???
if linux command www.cricode.com
welcome to cricode
|
其实第5点的r命令也能实现相同的功能。
实例8.i\命令
i\命令与a\命令相反,它是在匹配行的前面插入一行。
在包含hello的行前插入一行内容:kidding??
|
1
2
3
4
5
6
7
|
cricode>>sed '/hello/i\kidding???' sed.txt
#This is a sed command test file
kidding???
Hello,world hello,world
if linux command www.cricode.com
welcome to cricode
|
实例9. c\命令
c\命令将匹配行修改成我们设定的内容。
将包含hello的行替换成kidding??
|
1
2
3
4
5
|
cricode>>sed '/hello/c\kidding???' sed.txt
#This is a sed command test file
kidding???
if linux command www.cricode.com
welcome to cricode
|
其实这个替换功能可以通过第3点中方法实现:通过正则匹配来实现全行替换。
实例10. y命令
y命令与UNIX/Linux中的tr命令类似,字符按照一对一的方式从左到右进行转换。例如,y/abc/ABC/将把所有小写的a转换成A,小写的b转换成B,小写的c转换成C。
将文本中小写字母hi分别替换为大写字母HI:
|
1
2
3
4
5
|
cricode>>sed 'y/hi/HI/' sed.txt
#THIs Is a sed command test fIle
Hello,world Hello,world
If lInux command www.crIcode.com
welcome to crIcode
|
第二部分:Sed脚本
通过编写脚本我们可以方便的批量执行命令。sed脚本就是写在文件中的一系列sed命令。sed脚本中,要求命令的末尾不能有任何多余的空格或文本。如果在一行中有多个命令,要用分号分隔。执行脚本 时,sed先将输入文件中第一行复制到模式缓冲区,然后对其执行脚本中所有的命令。每一行处理完毕后,sed再复制文件中下一行到模式缓冲区,对其执行脚 本中所有命令。使用sed脚本时,不再用引号来确保sed命令不被shell解释。
下面举个栗子。
我们现在来完成如下任务:
1)在sed.txt中的开头插入一行作者信息:#Author:Jay13 2013-08-25
2)将文章中所有cricode替换成CRICODE。
3)在文本末尾加入一行:good bye!
那么我们可以编写一个名为sedscript脚本,脚本具体内容如下:
|
1
2
3
|
1i\#Author:Jay13 2013-08-25
s/cricode/CRICODE/g
$a\good bye!
|
然后再将sed脚本应用到sed.txt 文件上
|
1
2
3
4
5
6
7
|
cricode>>sed -f sedscript sed.txt
#Author:Jay13 2013-08-25
#This is a sed command test file
Hello,world hello,world
if linux command www.CRICODE.com
welcome to CRICODE
good bye!
|
第三部分:练习
学习了sed的基本知识,现在我们来实战一下。
1、Sed中如何替换多行中的有规律的数字字符串
输入:
hello world balabala – . gene_id “240838 “; transcript_id “240838“;
hello world balabala again – . gene_id “240838 “; transcript_id “240838“;
balaba….
输出:
hello world balabala - . gene_id “zgg240838 “; transcript_id “zgg240838“;
hello world balabala again - . gene_id “zgg240838 “; transcript_id “zgg240838“;
balaba…
也即,将字符串gene_id“后接数字以及transcript_id “后接数字中的引号与数字之间插入zgg字符串。
解答:
脚本编写如下:
sed ‘s/gene_id “\([0-9]\+\)”; transcript_id “\([0-9]\+\)”;/gene_id “zgg\1″; transcript_id “zgg\2″;/g’ test.txt
注:
1. 数字的匹配[0-9]
2.[0-9]后接\+表示匹配一个或多个数字
3.匹配部分加括号,引用匹配部分用\1,\2,….等等。
4.sed执行多个匹配用分号连接,整个命令用’’引在内部。
2、在文本中每一行添加行头行尾,在行投添加 Head单词,在行尾添加Tail单词。
解答:略
3、利用sed进行格式转换
比如需要将text.txt中如下内容
|
1
2
3
4
5
6
7
8
|
dn: uid=admin,ou=ITaccounts,dc=tc
uid: admin
cn: admin cn
sn: admin sn
dn: uid=0037,ou=employees,dc=tci
uid: 0037
cn: thinker
sn: zzz
|
转换成xml格式如下:
|
1
2
3
4
5
6
7
8
9
10
11
12
|
<entity>
<dn>uid=admin,ou=ITaccounts,dc=tc</dn>
<uid>admin</uid>
<cn>admin cn</cn>
<sn>admin sn</sn>
</entity>
<entity>
<dn>uid=0037,ou=employees,dc=tci</dn>
<uid>0037</uid>
<cn>thinker</cn>
<sn>zzz</sn>
</entity>
|
则可以定义下面的sedscript文件:
|
1
2
3
4
5
6
7
|
/^dn:[[:space:]]/i\
<entity>
s/^dn:[[:space:]]\(.*\)$/<dn>\1<\/dn>/g
s/^uid:[[:space:]]\(.*\)$/<uid>\1<\/uid>/g
s/^cn:[[:space:]]\(.*\)$/<cn>\1<\/cn>/g
s/^sn:[[:space:]]\(.*\)$/<sn>\1<\/sn>/g
s/^$/<\/entity>/g
|
第一行和第二行实现的功能就是在每个dn:开头的行前面加上一行<entity>。最后一行是碰到空行补上</entity>这 个结束标记。
另外,在执行替换的时候可以通过使用把被替换的字符串分组,在替换的部分里面用\1、\2这种方式引用被替换文字里面的相应的组。
用这种方法把ldif文件里面[:]前的东西删掉并且在两边增加相应的xml标记。
仔细想想,4行替换也许用下面的1行就能实现?
s/^\(.*\):[[:space:]]\(.*\)$/<\1>\2<\/\1>/g
|
1
2
3
4
5
6
7
8
9
10
11
|
cricode>> sed -f sedscript test.txt
<entity>
<dn>uid=admin,ou=ITaccounts,dc=tc</dn>
<uid>admin</uid>
<cn>admin cn</cn>
<sn>admin sn</sn>
<entity>
<dn>uid=0037,ou=employees,dc=tci</dn>
<uid>0037</uid>
<cn>thinker</cn>
<sn>zzz</sn>
|
=============================GAME OVER================================
sed(转)的更多相关文章
- sed的应用
h3 { color: rgb(255, 255, 255); background-color: rgb(30,144,255); padding: 3px; margin: 10px 0px } ...
- 文本处理三剑客之sed命令
第十八章.文本处理三剑客之sed命令 目录 sed介绍 sed命令常用选项 sed常用编辑命令 sed使用示例 sed高级语法 18.1.sed简介 sed全名stream editor,流编辑器,s ...
- 6-2 sed 命令
1. sed : stream editor,流编辑器 是处理纯ASICC纯文本,按行琢行操作的. 编辑器有两种,行编辑器和全屏编辑器 sed:默认不编辑原文件,仅对模式空间中的数据做处理,而后.处理 ...
- 基本shell编程【3】- 常用的工具awk\sed\sort\uniq\od
awk awk是个很好用的东西,大量使用在linux系统分析的结果展示处理上.并且可以使用管道, input | awk '' | output 1.首先要知道形式 awk 'command' fi ...
- sed awk grep三剑客常用
sed的常用用法: awk的常用用法: grep的常用用法: 除了列出符合行之外,并且列出后10行. grep -A 10 Exception kzfinance-front.log 除了列出符合行之 ...
- linux shell 用sed命令在文本的行尾或行首添加字符
转自 http://www.cnblogs.com/aaronwxb/archive/2011/08/19/2145364.html 昨天写一个脚本花了一天的2/3的时间,而且大部分时间都耗在了sed ...
- Sed、Awk单行脚本快速参考
文本间隔: # 在每一行后面增加一空行 sed G awk '{printf("%s\n\n",$0)}' # 将原来的所有空行删除并在每一行后面增加一空行. # 这样在输出的文本 ...
- sed awk 样例
sed [options] '[action]' filename options: -n:一般sed命令会把所有数据都输出到屏幕,如果加入此选项,则只会把经过sed命令处理的行输出到屏幕. -e:允 ...
- linux sed命令详解
简介 sed 是一种在线编辑器,它一次处理一行内容.处理时,把当前处理的行存储在临时缓冲区中,称为“模式空间”(pattern space),接着用sed命令处理缓冲区中的内容,处理完成后,把缓冲区的 ...
- sed命令详解
搜索 纠正错误 添加实例 sed 功能强大的流式文本编辑器 补充说明 sed 是一种流编辑器,它是文本处理中非常中的工具,能够完美的配合正则表达式使用,功能不同凡响.处理时,把当前处理的行存储在临时 ...
随机推荐
- 一个纯CSS DIV天气动画图标【转扒的】
<p> </p> <style><!-- /* SUNNY */ .sunny { -webkit-animation: sunny 15s linear i ...
- Django学习(一) Django安装配置
上一节介绍了如何搭建Python的开发环境,这次介绍一下如何搭建Django的开发环境. 第一.下载Django Django跟Python的版本对应 Django version Python ve ...
- DIV周边添加投影及背景固定
DIV周边添加投影.tou{ width:1000px; height:300px; border:0px solid #999; background:#FFF; margin:0 auto; ma ...
- Oracle EBS-SQL (BOM-18):检查BOM与工艺路线对照.sql
/*有工艺路线,无BOM清单*/ select msi.segment1, msi.description from apps.BOM_OPERATIONAL_ROUTINGS bor, apps.m ...
- How to delete the icons of Win7 desktop shortcuts
1. Copy the following bat code in txt type file, 2. save it as file extension type bat, run it as ad ...
- ui原则
http://www.niushe.com/news/show-3683.html 设计师Joshua Porter发表了一篇文章——<Principles of User Interface ...
- 从sample来学习Java堆(转)
1)Java堆 所有对象的实例分配都在Java堆上分配内存,堆大小由-Xmx和-Xms来调节,sample如下所示: public class HeapOOM { static class OOMOb ...
- 数组中出现次数超过一半的数字 -java
数组中出现次数超过一半的数字 -java 方法一: 数组排序,然后中间值肯定是要查找的值. 排序最小的时间复杂度(快速排序)O(NlogN),加上遍历. 方法二: 使用散列表的方式,也就是统计每个数组 ...
- 单链表反转(递归和非递归) (Java)
链表定义 class ListNode { int val; ListNode next; ListNode(int x) { val = x; } } 非递归实现很简单,只需要遍历一遍链表,在遍历过 ...
- Hadoop 5、HDFS HA 和 YARN
Hadoop 2.0 产生的背景Hadoop 1.0 中HDFS和MapReduce存在高可用和扩展方面的问题 HDFS存在的问题 NameNode单点故障,难以用于在线场景 NameNode压力过大 ...