查看: 444|回复: 0

[前端资源] 扣丁学堂红帽Linux开发培训之sed流编辑器命令详解

发表于 2018-8-22 11:40:01
  今天扣丁学堂红帽Linux培训老师给大家介绍一下关于sed流编辑器命令,首先sed是streameditor的简称,也就是流编辑器。它一次处理一行内容,处理时,把当前处理的行存储在临时缓冲区中,称为“模式空间”(patternspace),接着用sed命令处理缓冲区中的内容,处理完成后,把缓冲区的内容送往屏幕。接着处理下一行,这样不断重复,直到文件末尾。文件内容并没有改变,除非你使用重定向存储输出。

  sed命令的使用规则是这样的:

  sed[option]'command'input_file

  -n使用安静(silent)模式(想不通为什么不是-s)。在一般sed的用法中,所有来自stdin的内容一般都会被列出到屏幕上。但如果加上-n参数后,则只有经过sed特殊处理的那一行(或者动作)才会被列出来;其中option是可选的,常用的option有如下几种:

  -e直接在指令列模式上进行sed的动作编辑;

  -f直接将sed的动作写在一个文件内,-ffilename则可以执行filename内的sed命令;

  -r让sed命令支持扩展的正则表达式(默认是基础正则表达式);

  -i直接修改读取的文件内容,而不是由屏幕输出。

  常用的命令有以下几种:

  a\:append即追加字符串,a\的后面跟上字符串s(多行字符串可以用\n分隔),则会在当前选择的行的后面都加上字符串s;

  c\:取代/替换字符串,c\后面跟上字符串s(多行字符串可以用\n分隔),则会将当前选中的行替换成字符串s;

  d:delete即删除,该命令会将当前选中的行删除;

  i\:insert即插入字符串,i\后面跟上字符串s(多行字符串可以用\n分隔),则会在当前选中的行的前面都插入字符串s;

  p:print即打印,该命令会打印当前选择的行到屏幕上;

  s:替换,通常s命令的用法是这样的:1,2s/old/new/g,将old字符串替换成new字符串

  动作说明:[n1[,n2]]function

  n1,n2:不见得会存在,一般代表『选择进行动作的行数』,举例来说,如果我的动作是需要在10到20行之间进行的,则『10,20[动作行为]』

  命令示例,假设有一个本地文件test.txt,文件内容如下:

  [root@masterrh]#cattest.txt

  thisisfirstline

  thisissecondline

  thisisthirdline

  thisisfourthline

  thisfifthline

  happyeveryday

  end

  [root@masterrh]#sed'1a\addone'test.txt

  thisisfirstline

  addone

  thisissecondline

  thisisthirdline

  thisisfourthline

  thisfifthline

  happyeveryday

  end

  本例命令部分中的1表示第一行,同样的第二行写成2,第一行到第三行写成1,3,用$表示最后一行,比如2,$表示第二行到最后一行中间所有的行(包含第二行和最后一行)。

  本例的作用是在第一行之后增加字符串”addone”,从输出可以看到具体效果。

  [root@masterrh]#sed'1,$a\addone'test.txt

  thisisfirstline

  addone

  thisissecondline

  addone

  thisisthirdline

  addone

  thisisfourthline

  addone

  thisfifthline

  addone

  happyeveryday

  addone

  end

  addone

  本例表示在第一行和最后一行所有的行后面都加上”addone”字符串,从输出可以看到效果。

  [root@masterrh]#sed'/first/a\addone'test.txt

  thisisfirstline

  addone

  thisissecondline

  thisisthirdline

  thisisfourthline

  thisfifthline

  happyeveryday

  end

  本例表示在包含”first”字符串的行的后面加上字符串”addone”,从输出可以看到第一行包含first,所以第一行之后增加了”addone”

  [root@masterrh]#sed'/^ha.*day$/a\addone'test.txt

  thisisfirstline

  thisissecondline

  thisisthirdline

  thisisfourthline

  thisfifthline

  happyeveryday

  addone

  end

  本例使用正则表达式匹配行,^ha.*day$表示以ha开头,以day结尾的行,则可以匹配到文件的”happyeveryday”这样,所以在该行后面增加了”addone”字符串。

  i命令

  i命令使用方法和a命令一样的,只不过是在匹配的行的前面插入字符串,所以直接将上面a命令的示例的a替换成i即可,在此就不啰嗦了。

  c命令

  [root@masterrh]#sed'$c\addone'test.txt

  thisisfirstline

  thisissecondline

  thisisthirdline

  thisisfourthline

  thisfifthline

  happyeveryday

  addone

  本例表示将最后一行替换成字符串”addone”,从输出可以看到效果。

  [root@masterrh]#sed'4,$c\addone'test.txt

  thisisfirstline

  thisissecondline

  thisisthirdline

  addone

  本例将第四行到最后一行的内容替换成字符串”addone”。

  [root@masterrh]#sed'/^ha.*day$/c\replaceline'test.txt

  thisisfirstline

  thisissecondline

  thisisthirdline

  thisisfourthline

  thisfifthline

  replaceline

  end

  d命令

  [root@masterrh]#sed'/^ha.*day$/d'test.txt

  thisisfirstline

  thisissecondline

  thisisthirdline

  thisisfourthline

  thisfifthline

  end

  本例删除以ha开头,以day结尾的行。

  [root@masterrh]#sed'4,$d'test.txt

  thisisfirstline

  thisissecondline

  thisisthirdline

  本例删除第四行到最后一行中的内容。

  p命令

  [root@masterrh]#sed-n'4,$p'test.txt

  thisisfourthline

  thisfifthline

  happyeveryday

  end

  本例在屏幕上打印第四行到最后一行的内容,p命令一般和-n选项一起使用。

  [root@masterrh]#sed-n'/^ha.*day$/p'test.txt

  happyeveryday

  本例打印以ha开始,以day结尾的行。

  s命令

  实际运用中s命令式最常使用到的。

  [root@masterrh]#sed's/line/text/g'test.txt

  thisisfirsttext

  thisissecondtext

  thisisthirdtext

  thisisfourthtext

  thisfifthtext

  happyeveryday

  end

  本例将文件中的所有line替换成text,最后的g是global的意思,也就是全局替换,如果不加g,则只会替换本行的第一个line。

  [root@masterrh]#sed'/^ha.*day$/s/happy/veryhappy/g'test.txt

  thisisfirstline

  thisissecondline

  thisisthirdline

  thisisfourthline

  thisfifthline

  veryhappyeveryday

  end

  本例首先匹配以ha开始,以day结尾的行,本例中匹配到的行是”happyeveryday”这样,然后再将该行中的happy替换成veryhappy。

  [root@masterrh]#sed's/\(.*\)line$/\1/g'test.txt

  thisisfirst

  thisissecond

  thisisthird

  thisisfourth

  thisfifth

  happyeveryday

  end

  这个例子有点复杂,先分解一下。首先s命令的模式是s/old/new/g这样的,所以本例的old部分即\(.*\)line$,sed命令中使用\(\)包裹的内容表示正则表达式的第n部分,序号从1开始计算,本例中只有一个\(\)所以\(.*\)表示正则表达式的第一部分,这部分匹配任意字符串,所以\(.*\)line$匹配的就是以line结尾的任何行。然后将匹配到的行替换成正则表达式的第一部分(本例中相当于删除line部分),使用\1表示匹配到的第一部分,同样\2表示第二部分,\3表示第三部分,可以依次这样引用。比如下面的例子:

  [root@masterrh]#sed's/\(.*\)is\(.*\)line/\1\2/g'test.txt

  thisfirst

  thissecond

  thisthird

  thisfourth

  thfifth

  happyeveryday

  end

  正则表达式中is两边的部分可以用\1和\2表示,该例子的作用其实就是删除中间部分的is,希望对同学们有所帮助,想要了解更多关于Linux开发方面内容的小伙伴可以登录扣丁学堂官网咨询。扣丁学堂有大量的Linux视频教程让学员免费观看学习,想要快速学习Linux开发就到由专业老师授课的扣丁学堂学习吧。



回复

使用道具 举报