`
jayghost
  • 浏览: 429281 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类
最新评论

Unix文本处理工具之sed

 
阅读更多

转:http://blog.csdn.net/xia7139/article/details/10282861

sed也是Unix的文本处理工具。sed是Stream Editor(流式编辑器)的缩写,它能够基于模式匹配过滤(所谓过滤就是在文件中找到符合某些条件的行)修改文本(就是对找到的符合条件的内容进行一些修改操作)。

1、sed命令格式

1.1 sed命令的基本格式

sed命令主要有三种使用形式:

  • sed ‘编辑指令’ 文件1 文件2 ……:用于将处理后的结果输出
  • sed -n ‘编辑指令’ 文件1 文件2 ……:用于只输出编辑指令影响的行
  • sed -i ‘编辑指令’ 文件1 文件2 ……:用于直接在文本文件上修改文本内容(在物理磁盘上修改文件)

1.2 编辑指令

编辑指令主要由两部分组成:前面是逗号隔开的两个地址(或者没有逗号,只有一个地址),代表要处理文本的起始位置到结束位置;后面是要进行的操作类型。格式如下:

[起始地址[,结束地址]]操作类型

如果在一条sed命令中要用到多条编辑指令,那么各个编辑指令之间要用;隔开,也可以将多条编辑指令放在多个单引号中,但是这样的话,要在每个单引号的前面加一个-e。下面是一个简单的例子:

[plain] view plaincopy
 
  1. $cat sed_test.txt  
  2. 1 apple a,b,d,f  
  3. 2 boy alsdjf,apple,kdjf  
  4. 3 cat 163.2.201.1  
  5. 4 dog www.google.com  
  6. 5 eat http://blog.csdn.net/xia7139  
  7.   
  8. $sed -n '2,5p' sed_test.txt   
  9. 2 boy alsdjf,apple,kdjf  
  10. 3 cat 163.2.201.1  
  11. 4 dog www.google.com  
  12. 5 eat http://blog.csdn.net/xia7139  
  13.   
  14. $sed -n '5p' sed_test.txt   
  15. 5 eat http://blog.csdn.net/xia7139  
  16.   
  17. $sed -n -e '2p' -e'5p' sed_test.txt   
  18. 2 boy alsdjf,apple,kdjf  
  19. 5 eat http://blog.csdn.net/xia7139  

1.3 操作类型

sed常用的操作类型如下:

 

操作 作用
p 打印文本行(print)
n 取下一行(next)
d 删除(delete)
s 字符串替换(substitude)
a 追加新的文本(append)

2、例子

 

下面的例子都是对文提到的文件sed_test.txt的操作:

 

[plain] view plaincopy
 
  1. 使用正则表达式:  
  2. (1)输出从第一个包含kdjf的行到最后一行($代表最后一行)  
  3. $sed -n '/kdjf/,$p' sed_test.txt  
  4. 2 boy alsdjf,appleapple,kdjf  
  5. 3 cat 163.2.201.1  
  6. 4 dog www.google.com  
  7. 5 eat http://blog.csdn.net/xia7139  
  8. (2)输出包含单词apple的行  
  9. (shell中单词是指一个字符串前后有空格或其它标点符号。正则表达式中用一个<>来界定一个单词,在sed中用该符号要进行转义。)  
  10. $sed -n '/\<apple\>/p' sed_test.txt  
  11. 1 apple a,b,d,f  
  12.   
  13. 删除指定行(这里没有-i,不对原文件进行操作,只是将处理后的结果输出。):  
  14. (1)删除第2到4行  
  15. $sed '2,4d' sed_test.txt  
  16. 1 apple a,b,d,f  
  17. 5 eat http://blog.csdn.net/xia7139  
  18. (2)删除包含appleapple的行和最后一行($)  
  19. $sed '/appleapple/d;$d' sed_test.txt  
  20. 1 apple a,b,d,f  
  21. 3 cat 163.2.201.1  
  22. 4 dog www.google.com  
  23. (3)删除不包含(!表示反选,选中不符合条件的行)apple的行(这样就只剩下了包含apple的行了)  
  24. $sed '/apple/!d' sed_test.txt  
  25. 1 apple a,b,d,f  
  26. 2 boy alsdjf,appleapple,kdjf  
  27.   
  28. 替换指定文本:  
  29. (1)将1-4行的apple换成AMAZON。s代表替换,g代表如果一行出现两个apple则全部替换。  
  30. $sed '1,4s/apple/AMAZON/g' sed_test.txt  
  31. 1 AMAZON a,b,d,f  
  32. 2 boy alsdjf,AMAZONAMAZON,kdjf  
  33. 3 cat 163.2.201.1  
  34. 4 dog www.google.com  
  35. 5 eat http://blog.csdn.net/xia7139  
  36. (2)注释shell脚本(在行首插入#)  
  37. $sed '1,3s/^/#/g' sed_test.txt  
  38. #1 apple a,b,d,f  
  39. #2 boy alsdjf,appleapple,kdjf  
  40. #3 cat 163.2.201.1  
  41. 4 dog www.google.com  
  42. 5 eat http://blog.csdn.net/xia7139  
  43. (3)删除字符串apple(如果不写起始地址和结束地址,则默认为所有行。)  
  44. $sed 's/apple//g' sed_test.txt  
  45. 1  a,b,d,f  
  46. 2 boy alsdjf,,kdjf  
  47. 3 cat 163.2.201.1  
  48. 4 dog www.google.com  
  49. 5 eat http://blog.csdn.net/xia7139  

以上两篇文章介绍了Unix两个文本处理工具awk和sed,希望对大家有所帮助。

3、sed和正则表达式

利用正则表达式结合sed能极大地帮助我们处理文本。比如下面的例子:

 

[plain] view plaincopy
 
  1. 例1:正则表达式初步使用。  
  2. $ cat poem.txt   
  3.   The choice  
  4.             By William Butler Yeats  
  5.   The intellect of man is forced to choose  
  6.   Perfection of life ,or of the work,  
  7.   And if take the second must refuse  
  8.   A heavenly mansion ,raging in the dark.  
  9.   When all that story 's finished ,what's the news?  
  10.   In luck or out the toil has left its mark:  
  11.   That old perplexity an empty purse,  
  12.   Or the day's vanity ,the night's remorse.  
  13. (1)用命令删掉文本行首的空格。  
  14. $ sed 's/^\s*//g' poem.txt   
  15. The choice  
  16. By William Butler Yeats  
  17. The intellect of man is forced to choose  
  18. Perfection of life ,or of the work,  
  19. And if take the second must refuse  
  20. A heavenly mansion ,raging in the dark.  
  21. When all that story 's finished ,what's the news?  
  22. In luck or out the toil has left its mark:  
  23. That old perplexity an empty purse,  
  24. Or the day's vanity ,the night's remorse.  
  25. 也可以这样(注意,这里+是要被转义的,而上面的*不用转义。):  
  26. $ sed 's/^\s\+//g' poem.txt   
  27. The choice  
  28. By William Butler Yeats  
  29. The intellect of man is forced to choose  
  30. Perfection of life ,or of the work,  
  31. And if take the second must refuse  
  32. A heavenly mansion ,raging in the dark.  
  33. When all that story 's finished ,what's the news?  
  34. In luck or out the toil has left its mark:  
  35. That old perplexity an empty purse,  
  36. Or the day's vanity ,the night's remorse.  
  37.   
  38. (2)删掉文中所有的空格  
  39. $ sed 's/\s*//g' poem.txt   
  40. Thechoice  
  41. ByWilliamButlerYeats  
  42. Theintellectofmanisforcedtochoose  
  43. Perfectionoflife,orofthework,  
  44. Andiftakethesecondmustrefuse  
  45. Aheavenlymansion,raginginthedark.  
  46. Whenallthatstory'sfinished,what'sthenews?  
  47. Inluckoroutthetoilhasleftitsmark:  
  48. Thatoldperplexityanemptypurse,  
  49. Ortheday'svanity,thenight'sremorse.  
  50. 如下也可以达到同样的效果:  
  51. $ sed 's/\s\+//g' poem.txt   
  52. Thechoice  
  53. ByWilliamButlerYeats  
  54. Theintellectofmanisforcedtochoose  
  55. Perfectionoflife,orofthework,  
  56. Andiftakethesecondmustrefuse  
  57. Aheavenlymansion,raginginthedark.  
  58. Whenallthatstory'sfinished,what'sthenews?  
  59. Inluckoroutthetoilhasleftitsmark:  
  60. Thatoldperplexityanemptypurse,  
  61. Ortheday'svanity,thenight'sremorse.  
  62.   
  63. 也可以使用如下命令实现相关功能:  
  64. $ sed 's/^[[:space:]]*//g' poem.txt(删除行开头的空格)  
  65. $ sed 's/^[ ]*//g' poem.txt(删除行开头的空格)  
  66. $ sed 's/^ *//g' poem.txt(删除行开头的空格)  
  67. $ sed 's/^[[:space:]]*//g' poem.txt(删除行开头的空格)  
  68. $ sed '/^$/d' poem.txt(删除空行)  
  69. $ sed '/^[ ]*$/d' poem.txt(删除空行和只有空格的行)  

 

 

4、初步体会sed的威力

 

比如你有一个文件内容如下:

 

[python] view plaincopy
 
  1. test.txt:  
  2. {'books/daglib/0015113''<title>Scale-isometric polytopal graphs in hypercubes and Z<sub>n</sub>.</title>\n',  
  3.  'books/daglib/0097705''<title>Discrete total l<sub>p</sub>-norm approximation problem for the function.</title>\n',  
  4.  'books/daglib/p/AveneauCFM11''<title>A Framework for <i>n</i>-Dimensional Visibility Computations.</title>\n',  
  5.  'books/daglib/p/Carter11''<title>Using <i>Dungeons and Dragons</i> to Integrate Curricula in Classroom.</title>\n',  
  6.  'books/daglib/p/CasolaLRV11''<title>Access Control in Cloud-on-Grid Systems: The <i>PerfCloud</i> Case Study.</title>\n',  
  7.  'books/daglib/p/ChunKZDMZ11''<title>Reverse Engineer of Gene Networks with Application <i>in silico</i> Network.</title>\n',  
  8.  'books/daglib/p/ChungK11''<title>eQTL Mapping for Functional Classes of <i>Saccharomyces cerevisiae</i> Genes wssion.</title>\n',  
  9.  'books/daglib/p/Goldman11''<title>A Model for Computer Graphics Based on Algebra for \xe2\x84\x9d<sup>3</sup>.</title>\n',  
  10.  'books/daglib/p/LiZ11''<title>Line Geometry over \xe2\x84\x9d<sup>3, 3</sup>, and Stewart Platforms.</title>\n',  
  11.  'books/daglib/p/Liestol11''<title><i>Situated Simulations</i> Between Reality and Designing a Narrative Space.</title>\n'}  

现在你要将其中的各行中的类似于标签之类的东西去掉,只需用一条sed命令:

 

 

[plain] view plaincopy
 
  1. $sed -e 's/<title>//g;s/<\/title>//g' -e 's/<i>//g;s/<\/i>//g' -e 's/<sub>//g;s/<\/sub>//g' -e 's/<sup>//g;s/<\/sup>//g' test.txt   
  2. {'books/daglib/0015113': 'Scale-isometric polytopal graphs in hypercubes and Zn.\n',  
  3.  'books/daglib/0097705': 'Discrete total lp-norm approximation problem for the function.\n',  
  4.  'books/daglib/p/AveneauCFM11': 'A Framework for n-Dimensional Visibility Computations.\n',  
  5.  'books/daglib/p/Carter11': 'Using Dungeons and Dragons to Integrate Curricula in Classroom.\n',  
  6.  'books/daglib/p/CasolaLRV11': 'Access Control in Cloud-on-Grid Systems: The PerfCloud Case Study.\n',  
  7.  'books/daglib/p/ChunKZDMZ11': 'Reverse Engineer of Gene Networks with Application in silico Network.\n',  
  8.  'books/daglib/p/ChungK11': 'eQTL Mapping for Functional Classes of Saccharomyces cerevisiae Genes wssion.\n',  
  9.  'books/daglib/p/Goldman11': 'A Model for Computer Graphics Based on Algebra for \xe2\x84\x9d3.\n',  
  10.  'books/daglib/p/LiZ11': 'Line Geometry over \xe2\x84\x9d3, 3, and Stewart Platforms.\n',  
  11.  'books/daglib/p/Liestol11': 'Situated Simulations Between Reality and Designing a Narrative Space.\n'}  

如果要在原文件中修改,只需加-i参数。

 

转:http://leaver.me/archives/3162.html

Unix sed实用教程开篇

 

已经看了一段时间的Linux Shell编程了,也能完成一些基本的使用,为了加深理解,恰好看到了The Unix School的一个sed&awk教程,不是简单的命令参数堆积,而是一个相当实用的系列,因此,希望能在几天内完成翻译.翻译过程不会逐字翻译,会穿插一些注释,包括自己的一些理解和其他的一些引用,作为开篇,简单说一下sed的工作机制,对后面的理解会有很大帮助。

sed是什么:

sed是一个非交互式的流编辑器(stream editor)。所谓非交互式,是指使用sed只能在命令行下输入编辑命令来编辑文本,然后在屏幕上查看输出;而所谓流编辑器,是指sed每次只从文件(或输入)读入一行,然后对该行进行指定的处理,并将结果输出到屏幕(除非取消了屏幕输出又没有显式地使用打印命令),接着读入下一行。整个文件像流水一样被逐行处理然后逐行输出。(via Walk in Mindfields  )

sed工作机制:

sed维护两个缓冲区,pattern space和hold space,命令开始执行之前都为空。

pattern space缓冲区用于临时保存每次读取的一行的内容,大部分的匹配和替换等等操作都是针对pattern space中的内容进行的,因此不会对输入文件有任何影响,而hold space则作为后备缓冲区使用,除非指定了一些特殊的命令(例如D删除命令),否则pattern space中的内容会在处理完一行之后清空,但hold space中的内容在处理完每一行时不会被删除。

也就是说pattern space相当于我们的内存,hold space相当于硬盘.处理的时候在内存里,处理过的就放回硬盘.(这是我的理解,有一点点不恰当,但是因此一些概念会比较好理解.)

具体来说,可以大致分为以下几步:

1.首先,从标准输入流读取一行,移除换行符,然后存入pattern space中

2.执行指定的命令,(每个命令都有一个可选的地址(可以是行号,也可能是一个正则表达式匹配),这个地址作为一个执行命令前的测试,指定了需要对那些行进行操作。当前行只有匹配的情况下才会执行命令。)

3.当指定所有的命令都执行完了之后,pattern space内容就被处理过了,sed默认会将pattern space中的内容打印到标准输出中,移除的换行符也会打印出来。本行操作完成。

4.然后sed会读取下一行的内容,再次执行相同的操作。直到行尾。

 

基本上最基础的理论就差不多了.主要是这个工作机制比较重要.后面从示例中慢慢加深理解.

[译]Unix sed实用教程第一篇–向文件中增加一行

Sofa

Unix sed实用教程第一讲,本系列第一篇,有任何问题欢迎留言讨论。

sed 是unix中最重要的编辑器之一,注意,有之一..支持多种编辑任务,本文将实现题目的功能实例

假定我们有一额文本文件,叫做empFile,包含了员工名字和员工id,如下:

1.如何通过sed给文件添加标题行-“Employee, EmpId”

解释:数字1,是说只对第一行执行操作,i代表在insert(熟悉vim的同学应该知道,i会在当前字符的前面插入,a是在后面插入),因此,1i就表示在将Employee, EmpId插入到第一行之前,

然后,有了标题行的文件仅仅会输出到标准输出,源文件内容并不会改变,如果需要更新源文件,可以使用重定向输出到一个临时文件,然后移动到原始文件。如果Unix系统的sed是GUN版本的,sed会有一个-i选项,可以直接实现更新源文件,(如何查看版本,终端下输入sed –version即可看到)下面先执行,再查看文件,发现已经多了标题行了

2.如何在标题行之后,也就是原始第一行之前添加一行横线–“—–”

同1,中,1表示第一行,a表示append(附加),也就是说当读入第一行的时候在其之后添加一行,如果你使用2i作为命令也是正确的,就是指当读入第二行的时候,在其之前插入一行。

3.如何在文件尾部添加一行

为了在文件尾部插入一行,如果使用之前的方法就需要知道总共有多少行,而$符号则直接指明了最后一行,因此$a表示在读入最后一行的时候,在后面插入一行

4.如何在指定的记录之后插入一条新纪录

假定我们的例子文件的内容现在是:

如果我想在Hilesh这个员工之后插入Bharti员工的信息,我这样做:

注意看,我们这里已经不再使用数字或者其他表示行号的标识了,我们使用了一个模式(了解过正则表达式的朋友会比较熟悉,可以理解为某种规则- /Hilesh/a 这个命令表示对于每一行读入的内容,如果发现 /Hilesh/这个匹配,在该行之后插入一行,也就是说如果文件里有两行都是Hilesh员工,那么执行完上面的命令,将会附加两行内容,这里可以想想sed的工作模式,对每一行执行命令条件检测,发现匹配,就执行。

5.如何在指定记录之前插入记录呢,比如,我想在Harshal这条记录之前插入Aparna记录呢?

 

[译]Unix sed实用教程第二篇–替换文件内容

 
Sofa

上一节中-Unix sed实用教程第一篇–向文件中增加一行 学习了添加文件,本节讲解数据内容替换.

本节将使用sample1.txt文件作为示例,文件内容如下,都是些水果..:

1.向每一行的开头添加内容,这里我们添加“Fruit:”

解析:s代表substitution,也就是替换,s之后是要替换/匹配的内容,斜线/用来分隔s以及要替换的原始内容还有要替换的最终内容,而’^'符号是说一个正则,用来匹配每一行的开头,匹配成功后在开头加上’Fruit:’。

2.向每一行的行尾添加内容

注意,这里的$和上一节的$符号表示的意义不同,这里则是表示行尾.

3.如何替换指定的字符,这里将小写a替换成大写A

注意,仅仅将每一行的第一个a替换了,不是所有,本例表示替换单个字符,你可以替换一个单词都是可以的.

4.如何替换行内所有的字符,用A替换a

注意,只是加了一个g选项,g为global的简写,就是全局,全部的意思。

5.如何替换第二次出现的a?

不使用g,而是使用数字来表示行内第几次出现的a,结果如上

6.如何替换第二次之后的所有a呢?

很好理解对吧。

7.如果只想替换第三行的a呢?

回想一下第一节,在执行命令之前,会判断当前address是否满足条件,3就是地址

8.想替换一个范围行内的数据呢

逗号隔开,即可

9.如何替换整行呢?比如用apple is a Fruit替换apple

这里‘&’符号标识了模式匹配到的内容,而.*匹配了正行,.表示任意字符,*表示一个或多个,也就是匹配了整行,&因此就是整行内容,用来重命名一组文件的时候非常有用.

10.如何进行多个替换,比如用A替换a,用P替换p

也就是用分号分开即可。或者也可以通过-e参数来做

-e 选项就是当需要替换多个的时候来用的。

另外,要是替换的太多。也可以通过右斜线来分成多行

相信通过本文实例分析,平时的文件内容替换就很简单了

[译]Unix sed实用教程第三篇–读写文件

 
Sofa

本文将展示如何将文件内容读入到sed输出,同时包含如何将一个文件的部分内容写入到另一文件

一.文件读取

假定有两个文件,file1和file2,内容分别如下:

 

sed有两个选项用来读写文件

看例子:

1.在file1的每一行读完之后读取file2的内容

r file2读取file2的所有内容,因此r之前没有知道那个行号或匹配,因此有了上面的输出,记住,sed的工作机制,每次读file1的一行,然后执行命令

2.如何在读取了file1的第一行之后将file2读入

r前面加个1就行了

3.当file1某行匹配了模式之后,读入file2

sed逐行读入file1,然后判断该行是否匹配banana,如果匹配,就读入file2

4.当file1读取完成后读入file2,其实就是合并两个文件

这里只是演示一下,其实cat file1 file2就可以完成合并

二.文件写入

使用一个file1文件,内容如下:

 1.将file1的2-4行写入到file2

2,4w就是写2-4行的意思,那-n呢?默认情况下sed会把读入的文件处理的结果输出到标准输出,也就是终端,而为了不使用默认输出,-n就派上用场了,执行该命令终端不会有任何输出

查看file2内容,发现已经写入成功了

2.从第三行开始全部写入file2

就不多解释了

3.如果是用正则呢?

该命令将逐行读入file1,然后判断该行是否匹配apple,如果匹配,则作为起始行,然后继续读入,判断是否匹配mango,如果是,则作为终止行,然后将中间的内容写入到file2

[译]Unix sed实用教程第四篇–选择性打印

 
Sofa

本文,我们将会学习如何选择性的打印(其实,这里的打印是print,也就是输出到标准输出的意思),用到的示例文件是:

1.打印所有内容

一对单引号,没有任何参数即可

2.如何打印包含Gmail的那一行.(grep也可以实现这个功能)

在斜线里面,我们指定正则匹配模式,p的意思呢,就是print,打印的意思,也就是打印包含Gmail这一行,但是我们看到Gmail打印了两次,为什么,因为sed的默认行为是在解析完一行之后就把他输出出来,也就是对于Gmail这一行,先执行p解析,解析完成后再默认打印一次,就打印了两次,而其他的,没有命令解析,直接读入完成后输出即可。

如果得到期望的结果呢?

-n参数会取消sed的默认打印行为,所以就ok了

3.删除包含Gmail的那一行。(grep -v也有同样的效果)

d就是delete的意思,不多解释,

同样,要想删除某一指定的行

4.打印直到模式匹配,这里我们从头一直打印到Yahoo

q就是quit的意思,这条命令就是对于前面的行都没啥可解析的,执行默认的打印即可,一到碰到Yahoo这一行,打印完成,就停止,退出,因此,就是上面的了

打印某一指定范围行

到此,我们一直在学习基于一个条件取一行或多行,现在,我们来学习打印指定范围行

使用的示例文件如下:

5.打印前三行

-n先取消默认打印,然后1,3指定行范围,p表示打印,你想一下我们前面的q命令,就知道下面这个命令效果是一样的

执行默认打印,到第三行的时候退出

6.通过模式指定范围,这里我打印从Yahoo到Live之间的行,包括本身

不用多解释了

7.从指定模式到文件尾部,这里是从Redif到文件尾

回忆一下$符号吧.少年

8.从开头到匹配模式

相信你懂的…

对于数字不需要斜线包围,对于匹配需要斜线.就这样..

[译]Unix sed实用教程第五篇–替换文件内容续

 
Sofa

前面已经学习过替换文件内容了,本文我们学习一些更频繁使用的搜索替换操作.

示例文件使用:

1.替换每行开始的两个字母,这里用XX来替换

s代表substitute,前面说过了,^用来匹配行开头,.表示任意一个字符,两个..就是你懂的,

其实,不要^符号也是可以的,因为默认就是从开头开始匹配,如下也可以实现

2.删除每行开头的两个字符

看到没有,后两个斜线之间没有内容,也就是用空字符来替换开头的两个字符,就实现了删除

3.要是想删除每行最后的两个字符呢

再次强调,$在不同的情况下表示不同的意思,这里匹配行尾,有时候也匹配文件尾部

4.向每行末尾添加内容

这里,先匹配行尾,然后把”.Rs”添加到行尾

5.在每行开头添加空格

还记得前面说过的么,sed默认不影响原始文件,要是想更新原始文件,请加-i参数

6.移除开始的空格

^匹配行首,然后是一个空格,然后是*,表示一个或多个空格嘛,然后替换为空字符

7.移除行首和行尾的空格

不要怕,从分号处分开,就是两条命令啦,一个做行首的,一个做行尾的,前面说过的,可以使用-e参数来分开

8.如何在一个字符串前后添加一些其他字符呢,可以用来字符串转义

前两个斜线匹配了所有字符,也就是本行,然后后面两个斜线是替换的内容,注意里面的&符号,之前也说过的,表示匹配到的字符,也就是本行了。所有就这样啦

9.移除行首和行尾的一个字符(多个你也会的啦)

分开看看,你可以的

10.删除第一个数字之前的所有字符

这条命令略复杂,请先回头看一下我们的示例文件,然后我们开始分析这个表达式,地一个^表示匹配行首,然后[^0-9]* 是一个典型的正则,匹配非数字的多个字符,简单说一下[0-9]表示匹配0,1,2,3,4,5,6,7,8,9任意一个字符,前面加个一个^,表示非,也就是不匹配这些数字,然后最后是一个*,表示匹配非数字的连续多个字符,有机会的话我会推荐一个正则系列,或者自己写一篇文章。这里就先这样理解吧。

那猜猜这个是干嘛的

是的,你猜对了,删除开头的所有非字母字符。

11.删除行尾的数字

看看前面的你就知道了

12.通过分隔符得到文件最后一列

可能你你预想的不一样,是不是,你可能认为会是第一列被删除,其他的列都在,不对的,sed是很贪心的,当我们指定’.*:’时,他会一直向后查找,尽量匹配更多,所以,就匹配到最后一个列之前了

13.转换整行字符为小写

\L是sed的一个命令,Lowercase嘛。\L之后的内容被毁转换,而&表示前面匹配道德内容,所以就实现了转换

14.转换大写

\U你懂的,Uppercase

[译]Unix sed实用教程第六篇–删除文件内容

 
Sofa

其实,删除和替换是由一些相同的,不过,这里我们单独列出来,通过25个例子穿插讲解sed删除文件的一些方法,使用的示例文件如下:

1.删除第一行

d就是删除,1就是指第1行,记得哦,这不会影响到源文件,一般,做删除的时候一般要加-i参数,前面说过了

2.删除指定行,这里删除第3行

3.删除最后一行

4.删除范围行,这里删除2-4行

5.保留指定的行,这里保留2-4行

!这个是对前面的2,4来操作,是非的意思,也就是不是2-4行的行,这样除去2-4行,其他的都删除了

6.删除第一行和最后一行

分号隔开两个命令,你懂的,也可以删除第二行和第三行等等. ’2d;3d’

7.删除以指定字符开头的行

这里就把以L开头的Linux这一行删除了

8.删除以指定字符结尾的行

这里就删除了,可以看到AIX没有删除,unix区分大小写你懂的

9.忽略大小写,都删除

[xX]匹配x或X,所以就成功了嘛

10.删除文件中的空行

^匹配开头,$匹配结果,中间啥都没有,这样就匹配了空行,但是注意哦,如果某一行全是空格,这个命令是不会删除这一行的。

11.删除空行或是仅仅包含空格的行

如果你看我前面的文章,这个就不用我说了吧,0个或多个空格就是匹配了所有的空行了

12.删除完全是大写字母的行

[A-Z]就匹配了26个大写字母的任意一个

13.删除包含Unix匹配的行

14.删除不包含Unix的行

15.删除包含Unix或Linux匹配的行

这里要说的是|,这个本来是表示or,或的意思,但是在终端下,为了防止被认为是管道,所以要用\来转义

16.删除从第一行到满足匹配的行

可以通过行号到模式,模式到行号等等组合来匹配

17.删除从Linux匹配到末尾的行

18.如果最后一行匹配AIX就删除,否则就不删除

$匹配了最后一行,也可以是行号,比如1,后面的大括号里就是条件和处理方式了,这样就在sed里实现了if条件了,再看一遍这个例子,熟悉一下这个规则

19.所处最后一行如果满足两个匹配

20.如果1-4行满足Solaris匹配就删除

21.删除包含Unix匹配的行,同时删除下一行

N命令将下一行读入pattern space,什么。你忘了,看开篇去,这个命令就删除了两行

22.删除包含Unix的下一行

作者这里没有说清楚,我讲一下,N读入了下一行,然后这时候pattern space里就相当于两行并作了一行,中间有一个换行符,所以pattern space里现在就是:

然后通过s命令匹配了\nLinux,并且替换为空,就ok了哦。

23.删除包含Linux模式的行,也包含上一行

少年,不要怕,我们一步步来

首先,要知道,为了删除某一匹配的前一行,我们需要将文件的每一行放入到hold space里,一旦发现匹配,我们就开始删除连个缓冲区的内容,其中pattern space存储了当前行,hold space 存储了前一行

而x;p;这是啥呢,这两个命令是对每一行都会执行的,x表示exchange,即是交换hold space 和pattern space中的内容,p则是print,打印pattern space中的内容,因此,每次当前行被存入hold space,然后打印出了前一行的内容

当/Linux/匹配之后,我们使用s/.//来清空当前行,也就是pattern space为空了,当前行相当于被删了,然后使用x和hold space来交换,这样,就导致hold space为空了,然后使用d来删除pattern space的内容(此时pattern space里是交换过来的前一行的内容),因此,匹配Linnx的当前行和前一行都被删除了,

然后呢${x;p;}表示如果最后一行还在hold space里,就把他换出来,打印出来。

而后面的管道之后的命令呢,是吧第一部分sed命令之后产生的空行给删掉。

再理解一下

24.仅删除匹配Linux的前一行,不删除当前行

和23类似,当匹配到Linux的时候,hold space 存储了前一行的内容,所以我们交换一下他们,然后前一行就进入了pattern space,然后一个d,这样就把前一行删掉了。别急,还没完,这样,当前行就被留在hold space了。就无法被输出了

1h;1!{x;p;}  1h是说,如果将第1行移动到hold space,也就是1h只对第一行操作,而后面的1!{x;p;}是说对于其他的行执行x;p;命令,

25.删除匹配模式的前后两行

有了前面两个例子,自己试试理解一下,有问题留言讨论吧。

[译]Unix sed实用教程第七篇–输出文件内容(10 Demo)

 
Sofa

之前已经学习过选择性打印输出了,本文将通过10个例子全面讲解文件输出的一些方法,主打p命令

首先看一下将使用的示例文件

1.打印文件首行

之前讲过了,-n取消默认的全部打印,p表示print,1就是行号了

2.输出最后一行

3.输出不匹配X的那些行

也好理解,!表示非,就是说包含X匹配的不打印输出

4.输出包含u/x的那些行

正则是强大的,这样就匹配了u/x

5.输出以x/X结尾的那些行

这里$符号不再是匹配文件尾部,而是行尾,这是正则的规则

6.输出以A/L开头的行

前面也说过,^匹配了行首,A表示A匹配,然而\|则是或者的意思,为什么要加\转义,是为了避免被解析成pipe管道,后面的就不解释了

7.隔行打印

n命令是输出当前行,然后读入下一行到pattern space的意思,这句命令是这么执行的,首先读入一行,然后通过n命令输出,然后通过n命令再读一行,然后把这行删除,就出现了隔行输出的效果

8.如何两行输出,隔两行再输出

n;n; 命令呢输出了前两行,然后读入第三行到pattern space,N命令则对如下一行并与第三行合并,然后d命令删除pattern space中的内容,于是三四行被清空,然后读入56行,继续重复。就这样。作者这里给出的例子不直观,我举个例子,我的文件内容是

执行上面的命令后,会输出

明白了吧

9.输出某个范围行内以X结果的那些行

这里首先制定了从/Unix/匹配开始到文件尾部的这些行,然后呢,在这些之间的行,如果以X结果,就输出。

10.输出不包括开始和结尾的那些行

这个命令就会只输出/Solaris/和/HPUX/之间的行,不包括他们两个。

这里要说一下//这个,当匹配了Solaris的时候就进入了花括号,因为这个里面没有提供任何匹配,所以就考虑最后一次匹配模式,也就是相当于是考虑Solaris这一行,他不被打印,当到了HPUX这一匹配,//又代表了HPUX匹配,这一行也不打印。

Demo完了,你懂了么。

[译]Unix sed实用教程第八篇–CSV文件操作

 
Sofa

本文作为sed使用教程的最后一篇,将比较全面的讲解如何操作csv文件,csv文件通过逗号分隔

示例文件如下:

1.删除第一列

s开启替换模式,当^符号在中括号里的时候,就是非的意思,也就是说[^,]匹配了所有不是逗号的一个字符,然后后面的星号表示0个或多个,然后是一个逗号,也就是匹配”xxxx,”替换为空

2.删除除过最后一列的其他所有

sed先匹配任意多个字符,然后匹配最后一个“,”这就直接把前面的都匹配完了。替换为空即可。

3.输出第一列

好理解把,先匹配第一列之后的逗号,然后是多个字符,然后替换为空

4.删除第二列

先匹配第一列之后的逗号,然后匹配一个或多个非逗号字符,这样就匹配了第二列的内容,然后再匹配一个逗号,我简化一下,比如该列是1,2,3,4,那么这一个匹配就是”,2,”,替换成一个逗号,就是1,3,4了

5.输出第二列

我们可以分析前两个斜线之间的内容

两个右斜线转移了括号,所以括号不是简单的符号,而是正则里的组的意义,圆括号的作用是对字符进行分组,并保存匹配的文本。这里先匹配非逗号的多个字符,然后一个逗号,然后再匹配第二列,并且第二列的匹配用括号括起来,然后匹配其他列,然后里面用\1来引用这个括号的内容,如果前面有两个括号,就可以使用\1或\2这样,分别表示第一个括号或第二个括号的匹配

6.输出最后一列是一位数字的行

.*匹配了前面的所有字符,然后,匹配了最后一个逗号,sed的贪婪原则。。然后[0-9]匹配一个数字$表示行尾.ok

7.给每一行自动添加行号

这个和cat -n file的效果是一样的。awk也可以很简单的做,这里使用一个=命令会在每一行之前添加一个行号,也就是是,如果执行

文件会是:

然后我们通过管道再执行

N表示读入并合并下一行,然后将两行之间的换行符替换为空即可了

8.如果第一列是Ubuntu,就把最后一列替换成99

中间的

匹配“Ubuntu,任意个字符,任意个字符”,也就是将行分成几组,将本行替换成第一组的内容第一组的内容,第二组的内容,但最后的一列被替换成99,就这样。

9.如果第一列是RedHat就删除第二列

也好理解嘛。将要保留的用括号分组,然后用\1和\2分别引用第一组和第二组,然后中间的匹配就被删除了

10.在末尾插入一列

正则首先匹配了整行字符,然后使用&来引用该匹配,然后添加了一个逗号和一个A

11.在头部添加一列

很简单不是么…

比预计的要快,两天翻译完了.体会到了理解原理对学习sed的好处,希望对想学的人有帮助.

 

 

 

分享到:
评论

相关推荐

    sed 使用手册linux unix 下常用的文本处理工具。用来处理格式化文本

    sed awk 使用手册,linux unix 下常用的文本处理工具。用来处理格式化文本。

    软件基础_2018_07第二章UNIX工具+sed1

    第二章UNIX的软件工具2.1 Unix软件开发工具简介sed(Streamer Editor)称为字符流编辑程序,是一个非交互式的文本编辑程序,作者为Lee

    文本编辑sed基础教程

    适合于初学unix文本操作的学者 Linux 操作系统最大的一个好处是它带有各种各样的实用工具。存在如此之多不同的实用工具,几乎不可能知道并了解所有这些工具。可以简化关键情况下操作的一个实用工具是 sed。它是任何...

    windows 文本工具

    windows平台下使用linux/unix平台上的文本处理工具 grep wc head tail nl sed sort tr od uniq

    ASPAC-SED.rar_sed

    SED是UNIX环境下常用的工具之一.本文讲解如何使用SED进行文本处理与操作.

    awk和sed简体中文手册

    linux和unix的文本处理的优秀工具,手册为简体中文,通俗易懂,是学习awk和sed的好教程。

    sed命令调研文档(PDF)

    sed 实用工具是一个“编辑器”,但它与其它...sed 是 Linux 和 UNIX 工具箱中最有用的工具之一,且使用的参数非常少。在这篇文章中,我们将浏览最常用的命令和选项,并演示它们如何工作,以及它们适于在何处使用。

    UNIX命令及SHELL编程

    10_文本过滤-sed 用法介绍.PDF 11_文本过滤-合并与分割.PDF 12_文本过滤-tr 用法.PDF 13_登录环境-登录环境.PDF 14_登录环境-环境和shell变量.PDF 15_登录环境-引号.PDF 16_基础shell编程-shell脚本介绍.PDF ...

    unix4j:Java中Unix命令行工具的实现

    Unix4j为您提供unix命令的功能,例如文本处理,文件管理,以及Java等强类型和可测试语言带来的好处。 在Unix中,您可能会看到如下命令: cat test . txt | grep " Tuesday " | sed " s/kilogram/kg/g " | sort 在...

    绝版经典 LINUX与UNIX SHELL编程指南 PDF 高清版 [16.3M]

    本书共分五部分 ,详细介绍了SHELL编程技巧,各种UNIX命令及语法,还涉及了UNIX的文字处理以及少量的系统管理问题。本书内容全面,文字简洁流畅,适合SHELL编程人员学习、参考。 目录 第一部分 SHELL 第一章 文件...

    linux 文本扫描与处理--awk 使用手册

    与sed和grep很相似,awk是一种样式扫描与处理工具。但其功能却大大强于sed和grep。awk提供了极其强大的功能:它几乎可以完成grep和sed所能完成的全部工作,同时,它还可以可以进行样式装入、流控制、数学运算符、...

    sed and awk 101 hacks.pdf (中文版带书签)

    awk的处理文本和数据的方式是这样的,它逐行扫描文件,从第一行到最后一行,寻找匹配的特定模式的行,并在这些行上进行你想要的操作。 如果没有指定处理动作,则把匹配的行显示到标准输出(屏幕),如果没有指定模式,...

    LINUX与UNIX SHELL编程指南

    本书共分五部分 ,详细介绍了SHELL编程技巧,各种UNIX命令及语法,还涉及了UNIX的文字处理以及少量的系统管理问题。本书内容全面,文字简洁流畅,适合SHELL编程人员学习、参考。 目录 第一部分 SHELL 第一章 文件...

    Unix vi命令大全

    文本编辑器是所有计算机系统中最常用的一种工具。UNIX下的编辑器有ex,sed和vi等,其中,使用最为广泛的是vi,而vi命令繁多,论坛里好像这方面的总结不多,以下稍做总结,以资共享!渴望更正和补充!

    LINUX与UNIX SHELL编程指南(很全)

    10.2.2 使用sed在文件中查询文本的方式 90 10.2.3 基本sed编辑命令 90 10.3 sed和正则表达式 91 10.4 基本sed编程举例 91 10.4.1 使用p(rint)显示行 91 10.4.2 打印范围 91 10.4.3 打印模式 92 10.4.4 使用模式和...

    stream-editor:一种Web工具,用于交互式使用和链接sed,grep和awk等命令行文本操作实用程序

    Unix操作系统提供的文本转换工具在模式提取,格式化和数据操作方面具有强大的功能,但是在进行实验和调试时,命令行并非始终是使用它们的最佳界面,尤其是当您要链接多个命令与管道一起使用,并了解它们的作用。...

    Linux与Unix Shell编程指南(PDF格式,共30章)

    本书共分五部分,详细介绍了shell编程技巧,各种UNIX命令及语法,还涉及了UNIX下的文字处理以及少量的系统管理问题。本书内容全面、文字简洁流畅,适合Shell编程人员学习、参考。 目 录 译者序 前言 第一部分 ...

    LINUX与UNIX SHELL编程指南 高清PDF

    本书共分五部分,详细介绍了shell编程技巧,各种UNIX命令及语法,还涉及了UNIX下的文字处理以及少量的系统管理问题。本书内容全面、文字简洁流畅,适合Shell编程人员学习、参考。 目 录 译者序 前言 第一部分 shell...

    PowerShell基础教程.doc

    多年以来,许多文本处理实用工具程序,如sed、AWK 和 PERL,都已逐渐发展为支持这种交互模式。 这些外壳程序也会提供内置于外壳程序中并在外壳程序处理器中执行的命令,例如KSH 中的 typeset 命令和以及 Cmd.exe 中...

Global site tag (gtag.js) - Google Analytics