十二、sed文本处理

 

非交互,基于模式匹配过滤及修改文本
逐行处理,并把结果输出到屏幕
可实现对文本的输出、删除、替换、复制、剪切、导入、导出等各种操作
默认不编辑原文件,仅对模式空间中的数据做处理;而后,处理结束后 ,将模式空间打印至屏幕;

 

基本用法

 

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读下一行    读入下一行进行处理(产生隔行的效果)

 

 

 

 

 

 

 

转载于:https://www.cnblogs.com/zhongguiyao/p/8995915.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值