当前位置:首页>编程日记>正文

linux之sed命令n,N,d,D,p,P,h,H,g,G,x解析

前言

sed执行模板 = sed ‘模式{命令1;命令2}’ 文件,即逐行读入模式空间,执行命令,最后输出打印出来。

sed的语法格式:

sed [option] 'pattern{sed-command1;sed-command2}' {input-file}

sed在正常情况下,将处理的行读入模式空间(pattern space),脚本中的“sed-command(sed命令)”就一条接着一条进行处理,直到脚本执行完毕,然后该行被输出,模式(pattern space)被清空。接着,在重复执行刚才的动作,文件中的新的一行被读入,直到文件处理完毕。

linux之sed命令n,N,d,D,p,P,h,H,g,G,x解析 配图01

但是,由于种种原因,如用户希望在某个条件下,脚本中的某个命令被执行或希望模式空间(pattern space)保留,以便下一次使用,这都有可能使sed在处理文件的时候,不按照正常的流程来进行处理,这时候就需要用sed高级命令来满足需求。

p和P命令

p打印当前模式空间所有内容,追加到默认输出之后;P打印当前模式空间开端至 的内容,并追加到默认输出之前。
Sed并不对每行末尾 进行处理,但是对N命令追加的行间 进行处理,因为此时sed将两行看做一行。

n和N命令

命令n:读取下一行到pattern space。由于pattern space中有按照正常流程读取的内容,使用n命令后,pattern space中又有了一行,此时,pattern space中有2行内容,但是先读取的那一行不会被删除;当n命令后,还有其他命令p的时候,此时打印出的结果是n命令读取的那一行的内容。

看下图,你就明白了。

新建文件,其内容如下

cat 1.txt

1

2

正常sed流程

linux之sed命令n,N,d,D,p,P,h,H,g,G,x解析 配图02

使用n命令后,

linux之sed命令n,N,d,D,p,P,h,H,g,G,x解析 配图03

N命令:将下一行添加到pattern space中。将当前读入行和用N命令添加的下一行看成“一行”。

新建文件1.txt

linux之sed命令n,N,d,D,p,P,h,H,g,G,x解析 配图04

使用N命令后

linux之sed命令n,N,d,D,p,P,h,H,g,G,x解析 配图05

=========================================================

n命令简单来说就是提前读取下一行,覆盖模型空间前一行(并没有删除,因此依然打印至标准输出),执行后续命令。然后再读取新行,对新读取的内容重头执行sed。如果命令未执行成功(并非跳过:前端条件不匹配),则放弃之后的任何命令,并对新读取的内容,重头执行sed。

例子:从aaa文件中取出偶数行

[root@localhost ~]# cat a.txt
This is 1   
This is 2   
This is 3   
This is 4   
This is 5
[root@localhost ~]# sed –n ‘n;p’ a.txt
This is 2   
This is 4   

读取This is 1,执行n命令,此时模式空间为This is 2,执行p,打印模式空间内容This is 2,之后读取This is 3,执行n命令,此时模式空间为This is 4,执行p,打印模式空间内容This is 4,之后读取This is 5,执行n命令,因为没有了,所以退出,并放弃p命令。因此,最终打印出来的就是偶数行。

N 追加下一行到当前行,把两行看作一行,但是 换行符还在。如果命令未执行成功,则放弃后面的命令,读取下一行再执行sed。
linux之sed命令n,N,d,D,p,P,h,H,g,G,x解析 配图06

使用N命令后
linux之sed命令n,N,d,D,p,P,h,H,g,G,x解析 配图07

N命令简单来说就是追加下一行到模式空间,同时将两行看做一行,但是两行之间依然含有 换行符,然后执行后续命令,然后再读取新行,对新读取的内容重头执行sed。此时,新读取的行会覆盖之前的行(之前的两行已经合并为一行)。如果命令未执行成功(并非跳过:前端条件不匹配),则放弃之后任何命令,并对新读取的内容,重头执行sed。

#例子:从aaa文件中读取奇数行
[root@localhost ~]# sed –n ‘N;P’ a.txt   -----因为读取第5行时,执行N,发现没有第6行,不满足,就退出,放弃P命令
This is 1   
This is 3   
[root@localhost ~]# sed –n ‘$!N;P’ a.txt   
This is 1   
This is 3   
This is 5
[root@localhost ~]#

注释中1代表This is 1 ,2代表This is 2 以此类推
注释:读取1,$!条件满足(不是尾行),执行N命令,得出1 2,执>行P,打印得1,读取3,$!条件满足(不是尾行),执行N命令,得出>3 4,执行P,打印得3,读取5,$!条件不满足,跳过N,执行P,打印得5

d和D命令

d命令是删除当前模式空间内容(不再传至标准输出),并放弃之后的命令,并对新读取的内容,重头执行sed。

[root@localhost ~]# sed ‘n;d’ a.txt 
This is 1   
This is 3   
This is 5
[root@localhost ~]#

注释:读取1,执行n,得出2,执行d,删除2,得空,以此类推,读取3,执行n,得出4,执行d,删除4,得空,但是读取5时,因为n无法执行,所以d不执行。因无-n参数,故输出1 3 5

D命令是删除当前模式空间开端至 的内容(不在传至标准输出),放弃之后的命令,但是对剩余模式空间重新执行sed。

Sed 'N;D' aaa           
This is 5   

注释:读取1,执行N,得出1 2,执行D,得出2,执行N,得出2 3,执行D,得出3,依此类推,得出5,执行N,条件失败退出,因无-n参数,故输出5

y命令:对之前匹配的字符逐个替换

[root@localhost ~]# awk '{print $0"h"}' a.txt | sed ‘y/his/HIS/’
THIS IS 1H
THIS IS 2H
THIS IS 3H
THIS IS 4H
THIS IS 5H
[root@localhost ~]#sed 's/[a-z]/u&/g' ddd   
This is A and A is 1   
This is B and B is 2   
This is C and C is 3   
This is D and D is 4   
This is E and E is 5    
#此外,如果需要对某个字符串进行大小写转换,则可使用如下方法    

h命令,H命令,g命令,G命令

h命令是将当前模式空间中内容覆盖至缓存区,H命令是将当前模式空间中的内容追加至缓存区
g命令是将当前缓存区中内容覆盖至模式空间,G命令是将当前缓存区中的内容追加至模式空间

[root@wmsvmpc ~]# sed –e ‘/101/h’ –e ‘$G’ cs1.txt 
PBCSPOFT0101    6
PBCSPOFT0102    0
PBCSPOFT0103    8
PBCSPOFT0104   0
PBCSPOFT0101    6
[root@wmsvmpc ~]#

在sed处理文件的时候,每一行都被保存在一个叫模式空间的临时缓冲区中,除非行被删除或者输出被取消,否则所有被处理的行都将打印在屏幕上。接着模式空间被清空,并存入新的一行等待处理。
在上面的例子里,匹配test的行被找到后,将存入模式空间,h命令将其复制并存入一个称为保持缓存区的特殊缓冲区内。第二条语句的意思是,当到达最后一行后,G命令取出保持缓冲区的行,然后把它放回模式空间中,然后被打印(也就末尾)。

[root@wmsvmpc ~]# sed –e ‘/101/h’ –e ‘/102/G’ cs1.txt   
PBCSPOFT0101    6
PBCSPOFT0102    0
PBCSPOFT0101    6
PBCSPOFT0103    8
PBCSPOFT0104    0
#追加到包含102的行的下一行

将ddd文件中数字和字母互换,并将字母大写

cat ddd.sed
h  
{  
s/.*is (.*) and .*/1/  
y/abcde/ABCDE/
G  
s/(.*)
(.*is ).*(and ).*(is )(.*)/25 35 41/  
}  sed –f ddd.sed ddd  
This is 1 and 1 is A  
This is 2 and 2 is B  
This is 3 and 3 is C  
This is 4 and 4 is D  
This is 5 and 5 is E    

注释:读取1,执行h,复制到缓存区,执行s,模式空间得到匹配到的字母a,然后执行y,将a转成A,执行G,追加缓存区内容到模式空间,得
A This is a and a is 1;执行s,重新排列,得出This is 1 and 1 is A;以此类推,得出结果。
这里需要注意的是匹配的内容中,空格一定要处理好,空格处理不对,会造成第二次s匹配错误,无法执行重新排列或排列错误

x命令

x命令是将当前缓存区和模式空间内容互换

[root@wmsvmpc ~]# sed –e ‘/101/h’ –e ‘/102/x’ cs1.txt   
PBCSPOFT0101    6
PBCSPOFT0101    6
PBCSPOFT0103    8
PBCSPOFT0104   0
#互换模式空间和保持缓冲区的内容。也就是把包含101与102的行互换。应该是替换.[root@wmsvmpc ~]#  echo –e "a
b
c
d
"|sed –nr 'H;${x;s/
//g;p}'
abcd

r:use extended regular expressions in the script,使用功能更强大的正则表达式。
${} 表示处理到文件最后一行时执行{}中的命令,x把之前存入缓存区的数据按先入先出的顺序放入模式空间,然后做替换,最后打印


http://www.coolblog.cn/news/2db3c94f3cb7eac1.html

相关文章:

  • asp多表查询并显示_SpringBoot系列(五):SpringBoot整合Mybatis实现多表关联查询
  • s7day2学习记录
  • 【求锤得锤的故事】Redis锁从面试连环炮聊到神仙打架。
  • 矿Spring入门Demo
  • 拼音怎么写_老师:不会写的字用圈代替,看到孩子试卷,网友:人才
  • Linux 实时流量监测(iptraf中文图解)
  • Win10 + Python + GPU版MXNet + VS2015 + RTools + R配置
  • 美颜
  • shell访问php文件夹,Shell获取某目录下所有文件夹的名称
  • 如何优雅的实现 Spring Boot 接口参数加密解密?
  • LeCun亲授的深度学习入门课:从飞行器的发明到卷积神经网络
  • Mac原生Terminal快速登录ssh
  • java受保护的数据与_Javascript类定义语法,私有成员、受保护成员、静态成员等介绍...
  • mysql commit 机制_1024MySQL事物提交机制
  • 支撑微博千亿调用的轻量级RPC框架:Motan
  • jquery 使用小技巧
  • 2019-9
  • 法拉利虚拟学院2010 服务器,法拉利虚拟学院2010
  • vscode pylint 错误_将实际未错误的py库添加到pylint白名单
  • 科学计算工具NumPy(3):ndarray的元素处理
  • 工程师在工作电脑存 64G 不雅文件,被公司开除后索赔 41 万,结果…
  • linux批量创建用户和密码
  • newinsets用法java_Java XYPlot.setInsets方法代碼示例
  • js常用阻止冒泡事件
  • 气泡图在开源监控工具中的应用效果
  • 各类型土地利用图例_划重点!国土空间总体规划——土地利用
  • php 启动服务器监听
  • dubbo简单示例
  • 【设计模式】 模式PK:策略模式VS状态模式
  • [iptables]Redhat 7.2下使用iptables实现NAT
  • Ubuntu13.10:[3]如何开启SSH SERVER服务
  • CSS小技巧——CSS滚动条美化
  • JS实现-页面数据无限加载
  • 阿里巴巴分布式服务框架 Dubbo
  • 最新DOS大全
  • Django View(视图系统)
  • 阿里大鱼.net core 发送短信
  • 程序员入错行怎么办?
  • 两张超级大表join优化
  • 第九天函数
  • Linux软件安装-----apache安装
  • HDU 5988 最小费用流
  • Sorenson Capital:值得投资的 5 种 AI 技术
  • 《看透springmvc源码分析与实践》读书笔记一
  • 正式开课!如何学习相机模型与标定?(单目+双目+鱼眼+深度相机)
  • Arm芯片的新革命在缓缓上演
  • nagios自写插件—check_file
  • python3 错误 Max retries exceeded with url 解决方法
  • 行为模式之Template Method模式
  • 通过Spark进行ALS离线和Stream实时推荐