sed
sed是一种流编辑器,流编辑器会在编辑器处理数据之前基于预先提供的一组规则来编辑数据流。
流编辑器
流编辑器是指sed每次只从文件或stdin中读入一行,将读入的行保存至模式空间然后根据指定的要求对其进行处理,并将处理后的结果输出至屏幕,接着读入下一行,整个文本的过程如流水线般被逐行处理后输出。
sed编辑器可以根据命令来处理数据流中的数据,这些命令要么从命令行中输入,要么存储在一个命令文本文件中。
工作流程
- 读取: sed从输入流(文件、管道、标准输入)中读取一行内容并存储到临时的缓冲区中(又称模式空间,pattern space)。
- buff:缓冲,使用内存空间,写的操作
- cache:缓存,使用内存空间,读的操作
- 执行:默认情况下,所有的sed命令都在模式空间中顺序地执行,除非指定了行的地址,否则sed命令将会在所有的行上依次执行。
- 显示:发送修改后的内容到输出流。在发送数据后,模式空间将会被清空。在所有的文件内容都被处理完成之前,上述过程将重复执行,直至所有内容被处理完毕。
在所有的文件内容都被处理完成之前,上述过程将重复执行,直至所有内容被处理完。 注意:默认情况下所有的sed命令都是在模式空间内执行的,因此输入的文件并不会发生任何变化,除非是用重定向存储输出。
命令格式
sed -e '操作' 文件1 文件2 ...
sed -n -e '操作' 文件1 文件2 ...
sed -f 脚本文件 文件1 文件2 ...
sed -i -e '操作' 文件1 文件2 ...
sed -e 'n{
操作1
操作2
...
}' 文件1 文件2 ...
常用选项
| 选项 | 作用 |
|---|---|
| -e 或 --expression= | 表示用指定命令来处理输入的文本文件,只有一个操作命令时可省略,一般在执行多个操作命令使用 |
| -f 或 --file= | 表示用指定的脚本文件来处理输入的文本文件 |
| -h 或 --help | 显示帮助 |
| -n、--quiet 或 silent | 禁止sed编辑器输出,但可以与p命令一起使用完成输出 |
| -i | 直接修改目标文本文件 |
- -i会直接修改文件
常用操作
| 操作 | 作用 |
|---|---|
| s | 替换,替换指定字符 |
| d | 删除,删除选定的行 |
| a | 增加,在当前行下面增加一行指定内容 |
| i | 插入,在选定行上面插入一行指定内容 |
| c | 替换,将选定行替换为指定内容 |
| y | 字符转换,转换前后的字符长度必须相同 |
| p | 打印,如果同时指定行,表示打印指定行;如果不指定行,则表示打印所有内容,如果有非打印字符,则以ASCII码输出。其通常与“-n”选项一起使用 |
| = | 打印行号 |
| l (小写L) | 打印数据流中的文本和不可打印的AscII字符(比如结束符$、制表符\t) |
输出行
- -n选项和p操作通常一起使用
只有一个操作可以不加-e
-
= 显示行号
-
打印数据流中的文本和不可打印的AscII字符
使用地址
sed编辑器寻址方式
- 以数字形式表示行区间
- 用文本模式来过滤出行
-
通过行号指定行打印
-
单行内容
-
范围行内容
-
显示奇数行
-
通过if语句实现,除2取余为1输出
-
通过n操作,当sed编辑器读入第一行,进行到n操作光标就会移动到下一行
-
-
-
通过内容指定行打印
-
可以通过正则筛选内容
-
|有或的作用,但其为特殊字符,要通过转义字符转义,或者添加**-r选项**
-
范围输出
-
删除行
- 全部删除,由于sed是流编辑器,所以如果不指定行会全部删除
sed -e 'd' 文件名
-
删除指定行
-
范围删除
-
结合正则表达式
-
删除空行
-
通过grep删除
-
通过tr删除
-
通过sed删除
-
-
根据内容进行范围删除
从第一个位置打开行删除功能,到第二个位置关闭行删除功能
-
替换
行范围 s/旧字符串/新字符串/替换标记
替换标记
- 数字:表明新字符串将替换第几处匹配的地方
- g:表明新字符串将会替换所有匹配的地方
- p:打印与替换命令匹配的行,与-n一起使用
- w 文件:将替换的结果写到文件中
使用方式
-
可通过正则表达式筛选行进行替换
-
替换为空字符,达到删除字符效果
-
&代表正则匹配到的结果
-
切换大小写
-
tr命令
-
sed命令
-
首字母大写
-
全部字母大写
-
全部字母小写
-
\b:锚定(锁定)第一个字符转换
-
-
-
结果写到文件中
- 修改之后的保存
- 修改之后的保存
分隔符可替换为其他字符
默认以/作为分隔符,若查找内容和替换内容中有/,就需要加\进行转义,特别麻烦。
因此,可以用其他字符代替/作为分隔符(大部分的符号和字符基本皆可作为分割符)。
注:如果查找字符和替换字符中包含与分隔符相同的字符,需要转义\
用指定的脚本文件来处理输入的文本文件
如果有多条命令执行,可写入脚本文件,通过执行脚本文件来处理
插入
-
整行替换
-
对应字符替换
-
a:每行下方插入
-
i:每行上方插入,用法和a相同
- 分别在行首行尾插入
- 分别在行首行尾插入
文件合并
r可以实现文件的合并
复制内容
复制的内容和原内容会有空行
剪切内容
即复制完后,将原有内容删除
位置调换
将内容用()括起来视为一个整体,再使用\1\2\3等分别表示,后面可按组合排序。
结合正则表达式
-
^、.、$的使用
-
[ ]的使用
字母部分大小写转换
- 将sh后缀文件的文件名改成大写