非交互,基于模式匹配过滤及修改文本
逐行处理,并把结果输出到屏幕
可实现对文本的输出、删除、替换、复制、剪切、导入、导出等各种操作
默认不编辑原文件,仅对模式空间中的数据做处理;而后,处理结束后 ,将模式空间打印至屏幕;
基本用法
sed [options] 'AddressCommand' file ... 前置命令 | sed [选项] '编辑指令' sed [选项] '编辑指令' 文件
相关说明:
'编辑指令'用来实现过滤操作,由'[定址符]处理动作'组成;
而'定址符'用来定义需要操作的文本,由[地址1,[地址2]]组成,地址1为起始位置,地址2为结束位置;
未指定'定址符'时,默认处理所有文本;
只指定地址1时,只处理与地址1相匹配的文本
常见命令选项;改变数据处理的方式
命令选项 注释 -n 屏蔽默认输出(全部文本) -i 直接修改文件内容 -f 表示正在使用sed脚本 -e 指定一条编辑命令;可指定多个处理动作 -r 启用扩展的正则表达式,若与其他选项一起使用,应作为首个选项 {} 可组合多个命令,以分号分隔
定址符
定址符,即[地址1,[地址2]]
是可选项,用来指定处理的起、止行数
不指定定址符时默认处理全部文本
定址符的表示方式可以使用行号和正则表达式
常见的处理动作
操作符 用途 指令示例 p 打印行 2,4p 输出第2、3、4行 2p;4p 输出第2行、第4行 d 删除行 2,4d 删除第2、3、4行 s 字符串替换 s/old/new/ 将每行的第1个old替换为new s/old/new/g 将所有的old都替换为new
注意:替换操作的分隔"/"可改用其他字符,如#、&等,便于修改文件路径
打印
sed -n '/^bin/p' a.txt 输出以bin开头的行 sed -n 'p;n' a.txt 输出奇数行,n表示读入下一行文本(隔行) sed -n 'n;p' a.txt 输出偶数行,n表示读入下一行文本(隔行) sed -n '10,${n;p}' a.txt 输出从第10行至文件末尾的所有偶数行 sed -n '$=' a.txt 输出文件的行数
删除
示例 含义解析 sed -n '3,5d' a.txt 删除第3~5行 sed -n '/xml/d' a.txt 删除所有包含xml的行 sed -n '/xml/!d' a.txt 删除所有不包含xml的行,!符号表示取反 sed -n '/^install/d' a.txt 删除以install开头的行 sed '$d' a.txt 删除文件的最后一行 sed -n '/^$/d' a.txt 删除所有空行 sed -n '/^$/{n;/^$/d}' a.txt 删除重复空行,连续两个空行只保留一个
注:此例中只作输出,不更改原文件(若需要更改,应添加选项-i)
s替换
语法:
sed [选项] '[定址符]s/源数据/新数据/选项' 文件名 命令 | sed [选项] '[定址符]s/源数据/新数据/选项'
例子:
示例 含义解析 sed 's/xml/XML/' a.txt 将每行中的第一个xml替换为XML sed 's/xml/XML/3' a.txt 将每行中的第3个xml替换成XML sed 's/xml/XML/g' a.txt 将所有的xml都替换成XML sed 's/xml//g' a.txt 将所有的xml都删除(替换为空串) sed 's/doc/&s/g' a.txt 将所有的doc都替换成docs,&代表查找串 sed '4,7s/^/#/' a.txt 将第4~7行注释掉(行首加#号) sed 's/^#an/an/' a.txt 解除以#an开头的行的注释(去除行首的#号)
注:此例中只作输出,不更改原文件(若需要更改,应添加选项-i)
注意:
源数据可以使用正则表达式表示 定址符:是可选项,作用就是现在替换数据范围,默认替换读入的所有数据 定址符可以用行号和 /正则表达式/ 表示 选项 g:全局替换 ,默认只替换第一个与源数据匹配的数据 i:忽略字母大小写替换 替换数据时,可以自定义源数据与新数据的间隔符号,间隔符号要一致 () 后向引用 保存与表达式匹配的数据 & 保存匹配的字符串
执行过程
以行为处理单位,逐行处理数据,处理完当前行字动处理下一行
直到文件处理完所有行为止
默认会把处理后的结果输出,然后输出处理的源数据
多个处理动作用;间隔
sed的实际应用
sed脚本的调用
1、复杂操作可存为脚本,通过-f调用
格式:sed -f 操作脚本 文件
sed文件块处理
文件块处理动作
操作符 用途 指令示例 i 行前插入文本 2iYY 在第2行之前添加文本行”YY” 4,7iYY 在第4-7行的每一行前添加文本行 a 行后插入文本 2aYY 在第2行之后添加文本 /^XX/aYY 在以XX开头的行之后添加文本 c 替换当前行 2cYY 将第2行的内容修改为”YY”
sed逐字符替换
操作y操作可实现逐个字符替换
修改后的文本有多行时
以换行符\n分隔
或者,以\强制换行
sed行替换的应用
sed行替换的应用:
找到主机名配置中的HOSTNAME行
整行替换为新的主机名配置
[root@localhost shell]# grep ^HOSTNAME /etc/sysconfig/network HOSTNAME=localhost.localdomain //修改前 [root@localhost shell]# sed -i '/HOSTNAME/cHOSTNAME=mysvr.tarena.com' /etc/sysconfig/network //整行替换操作 [root@localhost shell]# grep ^HOSTNAME /etc/sysconfig/networkHOSTNAME=mysvr.tarena.com //修改后
sed导入导出
导入导出动作
r动作应结合-i选项才会存入,否则只输出
w 动作以覆盖的方式另存为新文件
例子:
操作符 用途 指令示例 r 读入其他文件 3r b.txt 在第3行下方插入文件b.txt 4,7r b.txt 在第4-7每一行后插入文件b.txt w 写入其他文件 3w c.txt 将第3行另存为文件c.txt 4,7w c.txt 将第4-7行另存为文件c.txt
sed复制剪切
模式空间
存放当前处理的行,将处理结果输出
若当前行不符合处理条件,则原样输出
处理完当前行再读入下一行来处理
保持空间
作用类似于'剪切板'
默认存放一个空行(换行符\n)
主要处理动作
复制到剪贴板:
H 模式空间 ---[追加]--->保持空间 h 模式空间 ---[覆盖]--->保持空间
读取剪贴板内容并粘贴:
G 保持空间 ---[追加]--->模式空间
g 保持空间 ---[覆盖]--->模式空间
sed 的工作过程:
把要处理的行先读入自己模式空间,然后用处理动作处理,处理完后输出处理后的结果,并把源数据输出,然后读入下一行到模式空间进行处理 * 要处理的数据必须在模式空间,且模式空间不存储数据 保持空间 保持空间里默认只保存一个换行符号\n 要想存数据放到保持空间里,要手动把数据存进来了才可以; 保持空间只负责存储数据,不会输出数据 要想保持空间里的数据被sed处理,必须手动把保存空间里的数据调入模式空间 * 保持空间只负责存储数据 放在保持空间里的数据不会被输出也不会被处理。保持空间里默认只保存一个换行符号\n
sed流控制
参数选项 注释
!取反操作 根据定址条件取反
n读下一行 读入下一行进行处理(产生隔行的效果)