sed(stream editor) 是linux下一个流编辑器工具,主要是利用脚本来处理文本工具,可以依照指令来处理编辑文本文件,可以简化对文件的反复操作,编写转换程序等

  1. 替换文件中的单词
  2. 编写文件中插入或修改行的sed程序
  3. 过滤器来过去管道数据命令

命令格式

Bash
sed [option]... {script(模式匹配/sed程序命令)}[file]

选项参数

option (选项参数)功能
-e直接在指令列表上进行sed动作编辑,告诉sed下一个参数解释为sed指令,当有命令行上给出多个sed指令时才需要使用-e参数,一行命令语句可以执行多条sed命令
-i直接对内容修改 不加 -i时只是预览,不会对文件做实际修改
-f后面跟保存了sed指令的文件
-n取消默认输出,sed默认会输出所有文本内容,-n只显示处理过的行
-r(ruguler)扩展正则表达式,默认只识别基本正则表达式*

命令参数

命令功能
aadd 新增, a后面接字符串 字符串会在新的一行出现(当前行的下一行)
cchange 取代/更改, c后面接字符串 字符串可以取代匹配行的内容
ddelete 删除 删除匹配行
iinsert 插入, i后面接字符串 字符串会在新的一行出现(当前行的上一行)
pprint 打印 打印匹配的数据 通常和-n选项一起用
ssubstitute 替换 替换匹配内容
=打印被匹配行的行号
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.txt

sed缓存去数据交换

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