摘要:sed 是一种新型的,非交互式的编辑器。它能执行与编辑器 vi 和 ex 相同的编辑任务。sed 编辑器没有提供交互式使用方式,使用者只能在命令行输入编辑命令、指定文件名,然后在屏幕上查看输出。sed 把每一行都存在临时缓存区中,对这个副本进行编辑,所以不会修改或破坏源文件,它不会修改原文件,除非使用 shell 重定向或执行-i来保存输出结果。默认情况下,所有的输出行都被打印到屏幕上。
一、命令行格式: sed [选项] ‘command’ 输入文本
1、sed的常用选项
选项 | 说明 |
-n | 使用安静模式,在一般情况所有的STDIN都会输出到屏幕上,加入-n后只打印被sed特殊处理的行 |
-e | 多重编辑,且命令顺序会影响结果 |
-f | 指定一个sed脚本文件到命令行执行 |
-r | Sed使用扩展正则表达式 |
-i | 直接修改文档读取的内容,不在屏幕上输出 |
2、sed的操作命令
命令 | 功能 |
a\ | 在当前行后添加一行或多行。多行时除最后一行外,每行末尾需用“\”续行 |
c\ | 用此符号后的新文本替换当前行中的文本。多行时除最后一行外,每行末尾需用"\"续行 |
i\ | 在当前行之前插入文本。多行时除最后一行外,每行末尾需用"\"续行 |
d | 删除行 |
h | 把模式空间里的内容复制到暂存缓冲区 |
H | 把模式空间里的内容追加到暂存缓冲区 |
g | 把暂存缓冲区里的内容复制到模式空间,覆盖原有的内容 |
G | 把暂存缓冲区的内容追加到模式空间里,追加在原有内容的后面 |
l | 列出非打印字符 |
p | 打印行 |
n | 读入下一输入行,并从下一条命令而不是第一条命令开始对其的处理 |
q | 结束或退出sed |
r | 从文件中读取输入行 |
! | 对所选行以外的所有行应用命令 |
s | 用一个字符串替换另一个 |
g | 在行内进行全局替换 |
w | 将所选的行写入文件 |
x | 交换暂存缓冲区与模式空间的内容 |
y | 将字符替换为另一字符(不能对正则表达式使用y命令) |
备注:黑体字的命令g、w、x和y执行替换操作,谨慎使用。
二、使用例子
1、将/etc/passwd-test 的内容列出并且列印行号,同时请将第1~5行删除
执行指令# nl /etc/passwd-test | sed '1,5d'。如下图
备注:sed的动作为 '1,5d' ,那个d就是删除。因为1-5行删除了,所以显示的数据就没有1-5 行,从第6行开始显示。
2、删除第8到最后一行
执行指令# nl /etc/passwd-test | sed '8,$d'。如下图
3、在第2行后加上Drink Coffee
执行指令# nl /etc/passwd-test | sed '2a Drink Coffee'。如下图
4、在第2行前加上Drink Coffee
执行指令# nl /etc/passwd-test | sed '2i Drink Coffee'。如下图
5、在第2行后面加入两行字, Drink Tea or Drink Coffee
执行指令# nl /etc/passwd-test | sed '2a Drink Tea or \ 然后回车出现 > 这个标志后再输入Drink Coffee ?'。如下图
6、将第1-6行的内容取代成为 No 1-6 number
执行指令# nl /etc/passwd-test | sed '1,6c No 1-6 number'。如下图
7、仅列出第 8-18 行
执行指令# nl /etc/passwd-test | sed -n '8,18p'。如下图
8、搜索有root关键字的行
执行指令# nl /etc/passwd-test | sed '/root/p'。如下图
备注:如果root找到,除了输出匹配行,同时还输出该文件的所有行。
9、搜索有root关键字的行并删除
执行指令# nl /etc/passwd | sed '/root/d'。如下图
10、多点编辑,要求删除/etc/passwd-test第三行到末尾的数据,并把bash替换为redshell
执行指令# nl /etc/passwd-test | sed -e '3,$d' -e 's/bash/redshell/'。如下图
11、直接修改文件内容(危险动作),利用sed直接在 passwd-test 文件最后一行加入# This is a test file
执行指令# sed -i '$a # This is a test file' /etc/passwd-test。如下
备注: $代表的是最后一行,而a是新增指令,在该文件最后新增# This is a test file文字。