sed编辑器被称作流编辑器(stream editor),和普通的交互式文本编辑器恰好相反。
- 一次从输入中读取一行数据
- 根据所提供的编辑器命令匹配数据
- 按照命令修改流中的数据
- 将新的数据输出到STDOUT
流编辑器处理完流中的所有数据行后,才会终止。
sed options script file
选项允许修改sed命令的行为选项:
选项 | 描述 |
-e script | 在处理输入时,将script中指定的命令添加到已有的命令中 |
-f file | 在处理输入时,将file中指定的命令添加到已有的命令中 |
-n | 不产生命令输出,使用print命令来完成输出 |
使用方法:
sed 's/旧字符/新字符/'
注意:只替换每行第一个匹配的字符
例子:在一个文件输入以下内容
注意:这样使用并不会修改原文件内容,它只会将修改后的数据发送到STDOUT
使用多个编辑命令时,需要使用 -e 选项
两个命令都作用到文件中的每行数据上。命令之间必须用分号隔开,并且在命令末尾和分号之间不能有空格。
注意:命令行要在封尾单引号所在行结束命令
或者使用另一种格式:(进入sed编辑器命令列表)
需要使用 -f 来指定文件(sed的命令文件一般指定为 .sed 结尾)
例子:创建一个文件保存sed命令
命令行使用:
替换标志符:
替换标识符放在命令字符串之后
- 数字 标明新文本将替换第几处模式匹配的地方
- g 表明新文本将会替换所有所匹配的文本
- p 表明原先行的内容要打印出来
- w file 将替换的结果写到文件中
1.数字(n):只替换每行第n个匹配的地方
2.g 表明新文本将会替换所有所匹配的文本
3. p 表明原先行的内容要打印出
通常和-n一起使用,这样就输出被替换命令修改过的行
4.w file 将替换的结果写到文件中
- 需要用转义字符
- 使用!作为分隔符
例子:C shell替换/etc/passwd文件中的bash shell
1. / (正斜线),出现在了模式文本中的话,必须用反斜线来转义(比较麻烦,不推荐使用)
由于sed命令会作用于文本内容的所有行,想要单独的作用于某些行,需要使用行寻址。
- 以数字形式表示行区间 (数字放置在s前面)(编号以1开头)
- 用文本模式来过滤出行
1.使用数字的形式表示
2.文本模式过滤器:
sed编辑器允许指定文本模式来过滤出命令要用的行。
格式: /patten/command
例子:修改用户man 的默认shell
在单行或多行执行多条命令,使用{}将多条命令组合在一起
格式:
sed ’行寻址{
commands
}' file
指定第3行修改
指定第3-5行修改
格式:sed '寻址d' file
- sed 'd' file 流中的文本都会删除
删除单行:
删除多行:
使用sed编辑器的模式匹配删除行:删除含有 is 的行
注意:sed不会删除源文件的内容
第一个模式会”打开“行删除功能,第二个模式会“关闭”行删除功能
sed 编辑器会删除两个指定行之间的所有行(包括指定的行)。
- 要先打开才能使用
- 有打开没关闭,会删除打开后的数据,直到遇到下一个开关
例一:有打开有关闭 (删除区间内的数据)
例二:有打开没有关闭 (会删除开始后的数据)
例三:没打开有关闭(没打开,相当于不会执行)
例四:组合使用
格式: sed ' [address]command\new line'
格式1:
格式2:
把新行添加到最后一行:
修改: c(change)和添加的用法一致,但必须单独指定新行
使用文本模式修改命令修改行
注意点:使用区间时,用该行替换区间的行
y命令(transform)是唯一可以处理单个字符的sed编辑器命令
格式:
[address]y/inchars/outchars/
注意:inchars和outchars的值存在一对一的映射
例子:把g换为P 把 p换成 Q 把e换成K
- p 命令打印文本行
- = 命令用来打印行号
- l 命令 用来列出行
1. p 打印文本行(会打印两份数据)
使用-n 限制,打印一份数据
2. = 命令用来打印行号
3. l 列出行 (可以打印数据流中的文本和不可打印的ASCII字符任何不可打印字符要么在其八进制值前加一个反斜线,要么使用标准C风格的命名法
用$代表换行符
1.写入文件:
使用 w 命令
格式为:
[address]w filename
2.从文件中读取数据
读取(read)命令(r)允 许你将一个独立文件中的数据插入到数据流中
使用 r 命令
格式:
[address]r filename
将该文件的数据添加到 sedtext.text 文件末
sed处理多行文本的特殊命令:
- N 将数据流中的下一行加进来创建一个多行组来处理
- D 删除多行组中的一行
- P 打印多行组中的一行
- n 对单行操作
- N 对多行操作
1.对单行操作:小写的n命令告诉sed编辑器移动到数据流的下一行
删除匹配行的下一行。
2.合并文本行:大写的N会把下一行文本添加到模式空间中已有的文本后,将数据流中的两个文本行合并到同一个模式空间中文本行仍然用换行符分隔,但sed编辑器现在会将两行文本当成一行来处理。
把匹配行的下一行添加到该行的末尾并用空格隔开
分别位于两行的单词替换:先合并然后再替换
注意:由于最后一行没有下一行,所以无法执行,
最好的方法是,先筛选第一行是否是连续的 ,然后再合并检验是否是分开或连续的词组
- 单行删除用(d)
- 多行删除用(D)
使用 d 和 N 一起使用时,删除的是两行
使用 D和 N一起使用时 ,删除的是模式空间的第一行,会删除到换行符为止的所有字符。
1.先筛选再删除,只删除一行(筛选行放入模式空间)
2.先合并再删除,删除两行(两行放入模式空间)
- 打印命令 p
- 多行打印命令 P
当有多行匹配时P命令只会打印模式空间中的第一行
sed编辑器除了有模式空间,还用保持空间的缓冲区域,可以临时存放一些数据行。
!命令,用来排除命令,让原本会起作用的命令失效。
不输出所匹配的内容
sed编译器提供了一种方法,可以基于地址、地址模式或地址区间排除一整块命令。这允许你只对数据流中的特定行执行一组命令。
分支 b(branch)格式:
[address]b [label]
- adderss决定哪些会触发分支
- label 决定跳到的位置(默认跳到脚本结尾)
- 可以使用标签进行跳转,格式 :名称
2,3,4行触发分支,不会执行命令
标签的使用:
t (test)测试,可以用来改变sed脚本的执行流程,测试命令会根据替换命令的结果跳转到某个标签,而不是根据地址跳转,替换命令如果成功匹配并替换一个模式,测试命令就会跳到指定标签。
格式:
[ address ] t [ label ]
标签的使用(循环去除空格)
如何在匹配单词添加其他字符
例如把 man 改为 "man"
&修改的是整个单词,如何提取单词的一部分。
sed编译器用圆括号来定义替换模式中的子模式,可以在替代模式中使用特殊字符来引用每一个子模式。代替字符由反斜杠和数字组成。数字表明子模式的位置。sed编辑器会给模式分配字符\1,第二个子模式分配符\2 .....。
注意:在替换命令中使用括号时,需要用转义字符,代表不是普通的括号。
先用括号将the括起来,将其标示为一个子模式,\1 来提取第一个匹配的子模式
注意:括号里面的内容是不会被替换的,只是一个标记
先用括号括起the 需要替换的内容为 man 再把 isagood括起来 需要替换的内容为 man
\1 替换第一个man \2 替换的是第二个man
例子:将,穿插进字符串(使用{ }和text)
使用保持空间来输出空行:
原理为 保持空间没有内容时是空行,所以执行 G 会把保持空间的内容输出到模式空间
生成空行