`
jayghost
  • 浏览: 440161 次
  • 性别: 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在文本处理方面的强大功能。sed主要用于简单的文本替换、删除等操作,而awk则更适合于数据处理和分析。掌握这些基本用法能够极大地提高在Linux/Unix环境下对文本文件的操作效率。...

    好用的文本处理工具

    8. **awk/sed**:这两种工具常用于Linux和Unix环境中,通过正则表达式处理文本流,进行文本的格式化、替换、筛选等操作,是系统管理员和脚本编写者的利器。 9. **Perl**:虽然Perl主要被用作编程语言,但其在文本...

    unix学习资源__sed、awk

    在这个“unix学习资源__sed、awk”压缩包中,我们聚焦于两个非常重要的文本处理工具:sed和awk。这两个工具在Unix/Linux环境中对于数据处理和自动化任务至关重要。 **sed(Stream Editor)** 是一个流编辑器,它...

    类Unix系统优秀文本处理工具Awk详细介绍.doc

    《类Unix系统优秀文本处理工具Awk详细介绍》 在类Unix操作系统中,Awk是一种强大的文本分析工具,常被用于处理和分析结构化的文本数据。Awk的名字来源于其三位创造者——Alfred V. Aho、Peter J. Weinberger和Brian...

    Unix文本处理:1987年出版的“ UNIX文本处理”一书的原始资料

    《Unix文本处理》是1987年出版的一本经典著作,它深入探讨了在Unix操作系统环境下进行文本处理的各种技术和工具。这本书对于理解和利用Unix系统的强大文本处理能力至关重要,尤其对于那些希望提升文本操作效率、编写...

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

    Unix操作系统提供了丰富的软件开发工具,其中包含了各种文本处理和编程辅助工具。这些工具的高效性和灵活性使得Unix成为程序员和系统管理员的首选平台。本章主要介绍的是Unix中的几个关键工具,包括sed、BACKUS系统...

    实践大师:UNIX awk和sed编程篇

    在IT领域,UNIX系统以其强大的命令行工具和脚本处理能力而备受推崇,其中awk和sed是两个不可或缺的文本处理工具。这篇“实践大师:UNIX awk和sed编程篇”无疑是一份深入学习这两个工具的宝贵资源。让我们一起探索awk...

    AWK是一种优良的文本处理工具。它不仅是 Linux 中也是任何环境中现有的功能最强大的数据处理引擎之一。

    在Linux和其他Unix-like操作系统中,AWK是标准的工具之一,因其强大的数据处理能力和灵活性而备受赞誉。它允许用户通过模式匹配和动作来处理文本文件,对于数据分析、日志分析以及格式化输出等任务尤其高效。 AWK的...

    计算机软件基础:08第二章UNIX工具sed_awk

    总的来说,sed和awk是UNIX/Linux系统中的得力助手,它们提供了高效、灵活的文本处理能力,是任何IT专业人士都应该掌握的基本技能。通过熟练运用这两个工具,可以极大地提高处理文本数据的效率,尤其在需要自动化处理...

    Unix流编辑器sed实例+(全三部分)

    在Unix和Linux环境下,存在一种功能强大且高效的文本编辑工具——**流编辑器sed**。本文旨在通过一系列实例来深入探讨sed的基本用法及其高级功能,帮助读者掌握sed这一利器。 #### 二、sed简介 **sed**(stream ...

    计算机软件基础:08第二章UNIX工具sed_awk.doc

    《计算机软件基础》课程中的第二章重点讲解了两种在UNIX系统中常用的文本处理工具:sed和awk。sed,全称Streamer Editor,是一个非交互式的文本流编辑器,它由Lee E. McMahon开发,主要用于对文本文件进行自动化编辑...

    计算机软件基础:08第二章UNIX工具sed-awk.doc

    总之,sed和awk是UNIX/Linux环境下进行文本处理和数据操作不可或缺的工具。它们提供了灵活的命令语法和强大的功能,使得在命令行环境中处理文本数据变得高效且便捷。掌握这两个工具,对于提高在计算机软件基础层面的...

    UNIX Shell awk sed 实例 精解 (第4版)

    在IT领域,尤其是在Linux系统管理中,Bash Shell、awk和sed是不可或缺的工具,它们在文本处理和自动化任务执行方面发挥着重要作用。本指南将深入解析这些工具的使用实例和精解,帮助读者理解并掌握这些强大的命令行...

    Unix Shell编程工具

    Unix Shell编程工具是Unix/Linux操作系统中...通过掌握这些工具,你不仅能提升在Unix/Linux环境下的工作效率,还能更好地理解和处理日常遇到的各种文本数据问题。不断练习和探索,你将成为一个熟练的Unix Shell编程者。

    批量pdg转换pdf_附示例(实践大师:UNIX+awk和sed编程篇.pdg

    awk和sed是UNIX/Linux系统中强大的文本处理工具。awk用于处理结构化的数据,如CSV或TSV文件,而sed则擅长对文本流进行查找、替换和编辑。在这个场景下,我们不会直接使用它们进行图像转换,但可以编写脚本来自动化...

    sed-4.2.1.rar包括sed-4.2.1-setup.exe、sed-4.2.1-dep.zip、sed-4.2.1-bin.zip

    `sed` 是“流编辑器”(Stream Editor)的缩写,它是一种功能强大的文本处理工具,广泛应用于Linux和Unix系统中。`sed` 可以读取数据流,对输入的数据进行各种操作,如替换、删除、插入等,并将处理结果输出。在给定...

    cpp-用类似SQL的语法可代替sedgrepAWKPerl简单应用的文本处置工具

    传统的Unix文本处理工具如sed、grep、AWK和Perl在处理文本时各有其特点,但bsed旨在简化这些操作,为程序员提供一种更直观、更易于理解的界面。 sed是一种流编辑器,常用于对输入流(标准输入或文件)进行模式匹配...

    Unix/Linux sed命令手册

    **Sed** (Stream Editor) 是一种在 Unix 和 Linux 系统中用于文本处理的强大工具。它允许用户通过命令行来自动化文本编辑任务,使得批量编辑文件变得更加简单高效。 ##### 1.1 何时使用 Sed - **重复编辑任务**: 当...

Global site tag (gtag.js) - Google Analytics