Shell sed编辑器

sed编辑器被称作流编辑器(stream editor),和普通的交互式文本编辑器恰好相反。

在交互式 文本编辑器中(比如vim ),你可以用键盘命令来交互式地插入、删除或替换数据中的文本。流编 辑器则会在编辑器处理数据之前基于预先提供的一组规则来编辑数据流
sed 编辑器可以根据命令来处理数据流中的数据,这些命令要么从命令行中输入,要么存储
在一个命令文本文件中

sed编辑器会执行的操作:

  • 一次从输入中读取一行数据
  • 根据所提供的编辑器命令匹配数据
  • 按照命令修改流中的数据
  • 将新的数据输出到STDOUT

流编辑器处理完流中的所有数据行后,才会终止。

sed的命令格式:

 sed   options   script    file

选项允许修改sed命令的行为选项:

选项 描述
-e  script 在处理输入时,将script中指定的命令添加到已有的命令中
-f   file  在处理输入时,将file中指定的命令添加到已有的命令中
-n 不产生命令输出,使用print命令来完成输出

1. s关键词: 用后面的字符替换前面的字符

使用方法:

sed  's/旧字符/新字符/'

注意:只替换每行第一个匹配的字符

例子:在一个文件输入以下内容

Shell sed编辑器_第1张图片

Shell sed编辑器_第2张图片

 注意:这样使用并不会修改原文件内容,它只会将修改后的数据发送到STDOUT

2.在命令行中使用多个编辑命令:

使用多个编辑命令时,需要使用  -e   选项

两个命令都作用到文件中的每行数据上。命令之间必须用分号隔开,并且在命令末尾和分号之间不能有空格。

注意:命令行要在封尾单引号所在行结束命令

 或者使用另一种格式:(进入sed编辑器命令列表

Shell sed编辑器_第3张图片

3.从文件中读取编辑命令

需要使用   -f    来指定文件(sed的命令文件一般指定为   .sed 结尾)

例子:创建一个文件保存sed命令

 命令行使用:

其他替换选项:

替换标志符:

替换标识符放在命令字符串之后

  • 数字   标明新文本将替换第几处模式匹配的地方
  • g         表明新文本将会替换所有所匹配的文本
  • p         表明原先行的内容要打印出来
  • w  file  将替换的结果写到文件中

1.数字(n):只替换每行第n个匹配的地方

 Shell sed编辑器_第4张图片

 2.g  表明新文本将会替换所有所匹配的文本

3. p  表明原先行的内容要打印出

通常和-n一起使用,这样就输出被替换命令修改过的行

Shell sed编辑器_第5张图片

 4.w  file  将替换的结果写到文件中

Shell sed编辑器_第6张图片

 替换特殊字符的方法:

  • 需要用转义字符
  • 使用!作为分隔符

例子:C shell替换/etc/passwd文件中的bash shell 

1.  / (正斜线),出现在了模式文本中的话,必须用反斜线来转义(比较麻烦,不推荐使用)

sed 's/\/bin\/bash/\/bin\/chs/' /etc/passwd
2. 使用!作为分隔符
sed 's!/bin/bash!/bin/csh!'  /etc/passwd

地址的使用:

由于sed命令会作用于文本内容的所有行,想要单独的作用于某些行,需要使用行寻址。

1.行寻址的方式:

  • 以数字形式表示行区间 (数字放置在s前面)(编号以1开头)
  • 用文本模式来过滤出行

1.使用数字的形式表示

  • sed '3s/people/man/' sedtext.txt   替换第3行
  • sed '3,5s/people/man/' sedtext.txt   替换3-5行,是一个区间
  • sed '3,$s/people/man/' sedtext.txt   替换3到结尾的所有行

2.文本模式过滤器:

sed编辑器允许指定文本模式来过滤出命令要用的行。

格式:    /patten/command

例子:修改用户man 的默认shell

2.命令组合

 在单行或多行执行多条命令,使用{}将多条命令组合在一起

格式:

sed ’行寻址{

commands

}'   file

指定第3行修改

Shell sed编辑器_第7张图片

 指定第3-5行修改

Shell sed编辑器_第8张图片

3.删除行

格式:sed '寻址d'  file

  • sed   'd'  file    流中的文本都会删除

 删除单行:

 

删除多行: 

 使用sed编辑器的模式匹配删除行:删除含有 is 的行

 注意:sed不会删除源文件的内容

 易错点:使用两个文本模式来删除某个区间内的行

第一个模式会”打开“行删除功能,第二个模式会“关闭”行删除功能

sed 编辑器会删除两个指定行之间的所有行(包括指定的行)。
  • 要先打开才能使用
  • 有打开没关闭,会删除打开后的数据,直到遇到下一个开关

例一:有打开有关闭 (删除区间内的数据)

 

 例二:有打开没有关闭 (会删除开始后的数据)

 例三:没打开有关闭(没打开,相当于不会执行)

例四:组合使用

Shell sed编辑器_第9张图片

4.插入和添加:

  • 插入:     i (insert)  在指定行增加一个新行
  • 添加:    a(append)在指定行增加一个新行

 格式: sed ' [address]command\new line'

格式1:

Shell sed编辑器_第10张图片

 格式2:

Shell sed编辑器_第11张图片

 把新行添加到最后一行:

Shell sed编辑器_第12张图片

5.修改行

修改: c(change)和添加的用法一致,但必须单独指定新行

Shell sed编辑器_第13张图片

 使用文本模式修改命令修改行

 注意点:使用区间时,用该行替换区间的行

6.转换命令(处理单字符)

 y命令(transform)是唯一可以处理单个字符的sed编辑器命令

格式:

[address]y/inchars/outchars/

注意:inchars和outchars的值存在一对一的映射

Shell sed编辑器_第14张图片

 例子:把g换为P  把 p换成 Q   把e换成K

7. 打印

  • p     命令打印文本行
  • =     命令用来打印行号
  • l       命令 用来列出行

1.    p  打印文本行(会打印两份数据)

Shell sed编辑器_第15张图片

使用-n 限制,打印一份数据

  

 2.   =   命令用来打印行号

Shell sed编辑器_第16张图片

 3.   l   列出行 (可以打印数据流中的文本和不可打印的ASCII字符任何不可打印字符要么在其八进制值前加一个反斜线,要么使用标准C风格的命名法

 

 用$代表换行符

sed对文件的操作

1.写入文件:

使用 w 命令

格式为:

[address]w filename

Shell sed编辑器_第17张图片

 2.从文件中读取数据

读取(read)命令(r)允 许你将一个独立文件中的数据插入到数据流中

使用 r 命令

格式:

[address]r filename

 将该文件的数据添加到 sedtext.text 文件末

Shell sed编辑器_第18张图片

多行命令:

sed处理多行文本的特殊命令:

  • N  将数据流中的下一行加进来创建一个多行组来处理
  • D  删除多行组中的一行
  • P  打印多行组中的一行

 next命令:

  • n    对单行操作
  • N   对多行操作

1.对单行操作:小写的n命令告诉sed编辑器移动到数据流的下一行

删除匹配行的下一行。

Shell sed编辑器_第19张图片

 2.合并文本行:大写的N会把下一行文本添加到模式空间中已有的文本后,将数据流中的两个文本行合并到同一个模式空间中文本行仍然用换行符分隔,但sed编辑器现在会将两行文本当成一行来处理。

把匹配行的下一行添加到该行的末尾并用空格隔开

 分别位于两行的单词替换:先合并然后再替换

 Shell sed编辑器_第20张图片

 注意:由于最后一行没有下一行,所以无法执行,

最好的方法是,先筛选第一行是否是连续的 ,然后再合并检验是否是分开或连续的词组

Shell sed编辑器_第21张图片

 多行删除命令:

  • 单行删除用(d)
  • 多行删除用(D)

使用 d 和 N 一起使用时,删除的是两行

Shell sed编辑器_第22张图片

使用 D和 N一起使用时 ,删除的是模式空间的第一行,会删除到换行符为止的所有字符。

1.先筛选再删除,只删除一行(筛选行放入模式空间)

Shell sed编辑器_第23张图片

2.先合并再删除,删除两行(两行放入模式空间) 

Shell sed编辑器_第24张图片

 多行打印命令:

  • 打印命令 p
  • 多行打印命令  P

Shell sed编辑器_第25张图片

 当有多行匹配时P命令只会打印模式空间中的第一行

Shell sed编辑器_第26张图片

 

保持空间

sed编辑器除了有模式空间,还用保持空间的缓冲区域,可以临时存放一些数据行。

Shell sed编辑器_第27张图片

Shell sed编辑器_第28张图片

 Shell sed编辑器_第29张图片

排除命令(!)

!命令,用来排除命令,让原本会起作用的命令失效。

 不输出所匹配的内容

Shell sed编辑器_第30张图片 

 

改变流

1.分支

sed编译器提供了一种方法,可以基于地址、地址模式或地址区间排除一整块命令。这允许你只对数据流中的特定行执行一组命令。

分支  b(branch)格式:

[address]b [label] 

  • adderss决定哪些会触发分支
  • label 决定跳到的位置(默认跳到脚本结尾)
    • 可以使用标签进行跳转,格式    :名称

2,3,4行触发分支,不会执行命令 

Shell sed编辑器_第31张图片

 标签的使用:

Shell sed编辑器_第32张图片

  2.测试

t (test)测试,可以用来改变sed脚本的执行流程,测试命令会根据替换命令的结果跳转到某个标签,而不是根据地址跳转,替换命令如果成功匹配并替换一个模式,测试命令就会跳到指定标签。

格式:

[ address ] t [ label ]

Shell sed编辑器_第33张图片

 标签的使用(循环去除空格)

Shell sed编辑器_第34张图片

 

你可能感兴趣的:(Shell,编辑器,linux)