sed(stream editor)流编辑器,Linux下一款功能强大的非交互流式文本编辑器,
(vim式交互式文本编辑器),可以对文本文件的每一行数据匹配查询之后
进行增删改查等操作,支持按行、按字段、按正则匹配文本内容,灵活方便,
适合大文件的编辑
一次处理一行内容, 将这行放入缓存(存区空间称为:模式空间),
然后才对这行进行处理,处理完后,将缓存区的内容发送到终端。
选项参数 | 功能 |
---|---|
-e | 直接在指令列模式上进行sed的动作编辑。它告诉sed将下一个参数解释为一个sed指令,只有当命令行上给出多个sed指令时才需要使用-e选项;一行命令语句可以执行多条sed命令 |
-i | 直接对内容进行修改,不加-i时默认只是预览,不会对文件做实际修改 |
-f | 后跟保存了sed指令的文件 |
-n | 取消默认输出,sed默认会输出所有文本内容,使用-n参数后只显示处理过的行 |
-r ruguler | 使用扩展正则表达式,默认情况sed只识别基本正则表达式 * |
命令 | 功能描述 |
---|---|
a | add新增,a的后面可以接字串,在下一行出现 |
c | change更改, 更改匹配行的内容 |
d | delete删除, 删除匹配的内容 |
i | insert插入, 向匹配行前插入内容 |
p | print打印, 打印出匹配的内容,通常与-n选项和用 |
s | substitute替换, 替换掉匹配的内容 |
= | 用来打印被匹配的行的行号 |
n | 读取下一行,遇到n时会自动跳入下一行 |
向文件中添加数据
sed '3ahello' sed.txt 向第三行后添加hello
sed '3ihello' sed.txt 向第三行前添加hello
这里并未修改源文件 添加-i命令修改源文件 sed -i '3ahello' sed.txt
sed '/abc/ahello' sed.txt 向abc后面添加 hello,若文件中多行包括abc,则每行后都会添加
sed '/abc/ihello' sed.txt /是通配符 向文件中所有abc的 前面添加hello
sed '$ahello' sed.txt $表示最后一行 在最后一行后添加 hello
sed '$ihello' sed.txt 最后一行前添加 hello
删除文件中的数据
sed '2d' sed.txt 删除该文件的第二行
sed '1d;4d' sed.txt 删除第1,4行
sed '1~2d' sed.txt 删除奇数行,从第一行开始删除,每个两行删掉一行
sed '1,3d' sed.txt 删除指定范围行数据。删除第1到3行数据
sed '1,3!d' sed.txt 对1,3! 取反进行删除,除去1到3行的数据,删除剩下行数据
sed '$d' sed.txt 删除最后一行数据
sed '/abc/d' sed.txt 删除匹配abc的行数据
sed '/abc/,$d' sed.txt 删除匹配行 到 最后一行的数据
sed '/abc/,+1d' sed.txt 删除匹配行及其下一行的数据
sed '/abc\|adc/!d' sed.txt 删除不匹配abc 或 adc 的行数据
这里的 | 或 需要转义 \| !取反
更改文件数据
sed '1chello' sed.txt 修改文件第一行为hello
sed '/abc/chello' sed.txt 将包含abc的行修改为hello
sed '$chello' sed.txt 将最后一行修改为hello
sed 's/abc/hello/' sed.txt 将文件中abc 替换为hello 默认替换每行第一个abc
sed 's/abc/hello/g' sed.txt 将文件中所有abc替换 g表示匹配全局符合的字符
sed 's/abc/hello/2' sed.txt 将每行匹配的第二个替换为hello
sed 's/abc/hello/2w sed2.txt' sed.txt 将每行中第二个匹配的itheima替换为hello , 将替换后的内容写入到sed2.txt文件中 w命令写入
sed -n 's/abc/hello/2pw sed2.txt' sed.txt
sed '/i/s/t.*//g' sed.txt 正则表达式匹配替换,t.* 表示 t后面的所有字符,不限个数
匹配有 i 的行,替换匹配行中 t 后的所有内容为空
sed 's/$/& test' sed.txt 每行末尾拼接test
sed 's/^/#/' sed.txt 每行行首添加注释 #
查询文件 或 管道中的数据
sed -n '/abc/p' sed.txt 查询含有 abc 的行数据
ps -aux | sed -n '/sshd/p' 管道过滤查询
sed -e '1d' -e 's/abc/adc/g' sed.txt 执行多个sed程序命令,删除第1行,替换abc为adc全部
sed '1d;s/itheima/itcast/g' sed.txt 方式2
sed高级用法,缓存区数据交互
-
首先需要明白, sed处理文件是逐行处理的, 即读取一行处理一行,输出一行;
-
sed把文件读出来每一行存放的空间叫模式空间, 会在该空间中对读到的内容做相应处理;
-
此外sed还有一个额外的空间即暂存空间, 暂存空间刚开始里边只有个空行, 记住这一点;
-
sed可使用相应的命令从模式空间往暂存空间放入内容或从暂存空间取内容放入模式空间;
h | 将模式空间里面的内容复制到暂存空间缓存区(覆盖方式) |
H | 将模式空间里面的内容复制到暂存空间缓存区(追加方式) |
g | 将暂存空间里面的内容复制到模式空间缓存区(覆盖方式) |
G | 将暂存空间里面的内容复制到模式空间缓存区(追加方式) |
x | 交换2个空间的内容 |
sed '1h;$G' sed.txt 第一行粘贴到最后一行
# 1h 从模式空间中将第一行数据复制到暂存空间(覆盖方式)
# $G 将暂存空间中的内容复制到模式空间中最后一行(追加方式)
sed '1{h;d};$G' sed.txt 第一行删除后粘贴到最后一行
# 1{h;d}对模式空间中的第一行数据 进行复制到暂存空间(覆盖方式)和删除模式空间中的第一行
sed '1h;2,$g' sed.txt 第一行数据复制 粘贴替换其他行
sed '1,3H;$G' sed.txt 前三行数据复制粘贴到最后一行
sed G -i sed.txt G暂存空间内容复制到模式空间,暂存空间有空行,完成每行添加空行的操作
# G 每行后面添加一个空行
# -i 修改源文件
sed -i '/^$/d' sed.txt -i 修改源文件, ^表示文件第一行,$表示文件最后一行, d表示删除,
^$之间什么也没有表示 删除所有空行