sed(stream editor) 是linux下一个流编辑器工具,主要是利用脚本来处理文本工具,可以依照指令来处理编辑文本文件,可以简化对文件的反复操作,编写转换程序等
- 替换文件中的单词
- 编写文件中插入或修改行的sed程序
- 过滤器来过去管道数据命令
命令格式
❯Bash
sed [option]... {script(模式匹配/sed程序命令)}[file]选项参数
| option (选项参数) | 功能 |
|---|---|
| -e | 直接在指令列表上进行sed动作编辑,告诉sed下一个参数解释为sed指令,当有命令行上给出多个sed指令时才需要使用-e参数,一行命令语句可以执行多条sed命令 |
| -i | 直接对内容修改 不加 -i时只是预览,不会对文件做实际修改 |
| -f | 后面跟保存了sed指令的文件 |
| -n | 取消默认输出,sed默认会输出所有文本内容,-n只显示处理过的行 |
| -r(ruguler) | 扩展正则表达式,默认只识别基本正则表达式* |
命令参数
| 命令 | 功能 |
|---|---|
| a | add 新增, a后面接字符串 字符串会在新的一行出现(当前行的下一行) |
| c | change 取代/更改, c后面接字符串 字符串可以取代匹配行的内容 |
| d | delete 删除 删除匹配行 |
| i | insert 插入, i后面接字符串 字符串会在新的一行出现(当前行的上一行) |
| p | print 打印 打印匹配的数据 通常和-n选项一起用 |
| s | substitute 替换 替换匹配内容 |
| = | 打印被匹配行的行号 |
| n | 读取下一行,遇到n时会自动跳入下一行 |
| r/w | 读/写编辑命令, r将内容读入文件,w将匹配内容写入文件 |
特殊符号
| 命令 | 功能 |
|---|---|
| ! | 取反 |
| & | 保存查找串以便在替换串中引用 |
| {sed命令1;sed命令2} | 多个命令操作同一行 |
示例
指定行号前后添加数据
❯Bash
# sed.txt 文件的第3行后一行添加hello
sed 3ahello sed.txt
# 文件有空格要单引号引起来
sed '3ahello world' sed.txt
# 直接在原文件修改
sed -i '3ahello world' sed.txt
# sed.txt 文件的第3行前一行添加hello 添加后该行为第三行
sed '3ihello world' sed.txt指定内容前后添加数据
❯Bash
# 在含有world的行前面插入ok
sed '/world/iok' sed.txt
# 在含有world的行后面插入ok
sed '/world/aok' sed.txt最后一行前后添加数据
❯Bash
# 最后一行后面添加
sed '$ahello' sed.txt
# 最后一行前面添加
sed '$ihello' sed.txt删除文件数据
❯Bash
# 删除第2行
sed '2d' sed.txt
# 删除奇数行 第一行开始 每隔2行删除一次
sed '1~2d' sed.txt
# 删除指定范围多行
sed '1,3d' sed.txt
# 删除指定范围取反的多行数据
sed '1,3!d' sed.txt
# 删除最后一行
sed '$d' sed.txt
# 删除匹配world的行
sed '/world/d' sed.txt
# 删除匹配行到最后一行
sed '/world/, $d' sed.txt
# 删除匹配行和后一行
sed '/world/, +1d' sed.txt
# 删除不匹配的行 保留 world 和 worlds 的行 删除其他行 \|转义 或
sed '/world\|worlds/!d' sed.txt
# 删除1~3行中匹配hello的行
sed '1,3{/hello/d}' sed.txt
# 删除里面的空行
sed '/^$/d' sed.txt修改文件中的数据
❯Bash
# 修改第一行为hi
sed '1chi' sed.txt
# 将包含hello的行修改为hi 替换整行
sed '/hello/chi' sed.txt
# 最后一行修改为hello
sed '$chello' sed.txt替换文本
❯Bash
# hello 替换为hi 替换改行遇到的第一个
sed 's/hello/hi/' sed.txt
# hello 替换为hi 改行遇到的全部替换
sed 's/hello/hi/g' sed.txt
# 第二个hello 替换为hi
sed 's/hello/hi/2' sed.txt
# 替换后的行写入文件 新文件只有修改过的行 覆盖式写入 w后接 写入文件
sed 's/hello/hi/2w sed2.txt' sed.txt
# 打印修改的行 n为修改行操作 p为打印
sed -n 's/hello/hi/2pw sed2.txt' sed.txt正则表达式替换
❯Bash
# 匹配有i的行 替换匹配行中t后所有的内容为空 /i/ s/t.*/ / p
sed -n '/i/s/t.*//p' sed.txt
# 每行末尾拼接一个test & 拼接 $为行尾
sed 's/$/& test/' sed.txt
# 每行行首拼接#号 ^为行首
sed 's/^/#&/' sed.txt
# 每行数字增加小括号
sed 's/^[0-9]/(&)/' sed.txt
# /可以替换为# 所有行开头拼接#
#紧跟在s命令后的字符就是查找串和替换串之间的分隔符。分隔符默认为正斜杠,但可以改变。无论什么字符(换行符、反斜线除外),只要紧跟s命令,就成了新的串分隔符。
sed 's#^#\#&#'查询文件或管道中的数据
❯Bash
# 查询含有hi的行数据
sed -n '/hi/p' sed.txt
# 查询管道过滤的数据
ps -aux | grep sshd
ps -aux | sed -n '/sshd/p'读写文件内容
❯Bash
# sed2.txt 文件第三行之后插入sed1.txt的内容
sed '3r sed1.txt' sed2.txt
# sed2.txt 写入到sed1.txt中 不存在则创建
sed 'w sed1.txt' sed2.txt多个sed命令的执行
❯Bash
# 第一行删除 hello 替换为hi -e 或者;隔开
sed -e '1d' -e 's/hello/hi/g' sed.txt
sed '1d;s/hello/hi/g' sed.txtsed缓存去数据交换
sed 是逐行处理文件 读一行 处理一行
sed 把文件读出来每一行存放的空间叫做模式空间,会在该空间对读到的内容做相应的处理
sed还有一个额外的空间为暂存空间 暂存空间刚开始默认有一个空行
sed可以使用相应的命令从两个空间交换交换内容
sed缓存区命令
| 命令 | 含义 |
|---|---|
| h | 模式空间内容复制到暂存空间(覆盖方式) |
| H | 模式空间内容复制到暂存空间(追加方式) |
| g | 暂存空间内容复制到模式空间(覆盖方式) |
| G | 暂存空间内容复制到模式空间(追加方式) |
| x | 交换两个空间内容 |
缓存空间数据交换
❯Bash
# 第一行粘贴到最后一行
# 模式空间第一行复制到暂存空间 暂存空间内容复制到模式空间最后一行
sed '1h; $G' sed.txt
# 第一行删除 后粘贴到最后一行
sed '1{h;d};$G' sed.txt
# 第一行数据复制粘贴 替换其他行数据
sed '1h; 2,$g' sed.txt
# 前三行数据复制粘贴到最后一行
sed '1,3H;$G' sed.txt
#每一个添加空行
sed '1,$G' sed.txt
sed 'G' sed.txt