摘自:https://blog.csdn.net/WMSOK/article/details/78463199

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

2017年11月06日 23:21:44 DataCareer 阅读数:503 标签: sedlinuxshell 更多
个人分类: Shell
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/WMSOK/article/details/78463199

前言

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

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

n和N命令

  • n命令简单来说就是提前读取下一行,覆盖模型空间前一行,然后执行后续命令。然后再读取新行,对新读取的内容重头执行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   
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

读取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命令简单来说就是追加下一行到模式空间,同时将两行看做一行,但是两行之间依然含有\n换行符,然后执行后续命令。然后再读取新行,对新读取的内容重头执行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
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

注释中1代表This is 1 2代表This is 2 以此类推 
注释:读取1,$!条件满足(不是尾行),执行N命令,得出1\n2,执>行P,打印得1,读取3,$!条件满足(不是尾行),执行N命令,得出>3\n4,执行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
  • 2
  • 3
  • 4
  • 5

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

  • D命令是删除当前模式空间开端至\n的内容(不在传至标准输出),放弃之后的命令,但是对剩余模式空间重新执行sed。
Sed 'N;D' aaa            This is 5   
  • 1
  • 2

注释:读取1,执行N,得出1\n2,执行D,得出2,执行N,得出2\n3,执行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/\b[a-z]\b/\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     #此外,如果需要对某个字符串进行大小写转换,则可使用如下方法     
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14

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

  • h命令是将当前模式空间中内容覆盖至缓存区,H命令是将当前模式空间中的内容追加至缓存区
  • g命令是将当前缓存区中内容覆盖至模式空间,G命令是将当前缓存区中的内容追加至模式空间
[root@wmsvmpc ~]# sed –e ‘/101/h’ –e ‘$G’ cs1.txt  PBCSPOFT0101    6 PBCSPOFT0102    0 PBCSPOFT0103    8 PB\CSPOFT0104   0 PBCSPOFT0101    6 [root@wmsvmpc ~]#
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

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

[root@wmsvmpc ~]# sed –e ‘/101/h’ –e ‘/102/G’ cs1.txt    PBCSPOFT0101    6 PBCSPOFT0102    0 PBCSPOFT0101    6 PBCSPOFT0103    8 PB\CSPOFT0104    0 #追加到包含102的行的下一行
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

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

cat ddd.sed h   {   s/.*is \(.*\) and .*/\1/   y/abcde/ABCDE/ G   s/\(.*\)\n\(.*is \).*\(and \).*\(is \)\(.*\)/\2\5 \3\5 \4\1/   }    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
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15

注释:读取1,执行h,复制到缓存区,执行s,模式空间得到匹配到的字母a,然后执行y,将a转成A,执行G,追加缓存区内容到模式空间,得 
A\nThis 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 PB\CSPOFT0104   0 #互换模式空间和保持缓冲区的内容。也就是把包含101与102的行互换。应该是替换.  [root@wmsvmpc ~]#  echo –e "a\nb\nc\nd\n"|sed –nr 'H;${x;s/\n//g;p}' abcd
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

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

Sed命令n,N,d,D,p,P,h,H,g,G,x解析3的更多相关文章

  1. 文本处理三剑客之sed命令

    第十八章.文本处理三剑客之sed命令 目录 sed介绍 sed命令常用选项 sed常用编辑命令 sed使用示例 sed高级语法 18.1.sed简介 sed全名stream editor,流编辑器,s ...

  2. linux shell 用sed命令在文本的行尾或行首添加字符

    转自 http://www.cnblogs.com/aaronwxb/archive/2011/08/19/2145364.html 昨天写一个脚本花了一天的2/3的时间,而且大部分时间都耗在了sed ...

  3. linux sed命令详解

    简介 sed 是一种在线编辑器,它一次处理一行内容.处理时,把当前处理的行存储在临时缓冲区中,称为“模式空间”(pattern space),接着用sed命令处理缓冲区中的内容,处理完成后,把缓冲区的 ...

  4. sed命令详解

    搜索 纠正错误  添加实例 sed 功能强大的流式文本编辑器 补充说明 sed 是一种流编辑器,它是文本处理中非常中的工具,能够完美的配合正则表达式使用,功能不同凡响.处理时,把当前处理的行存储在临时 ...

  5. Linux安全基础:sed命令的使用

    sed 是一个很好的文件处理工具,本身是一个管道命令,主要是以行为单位进行处理,可以将数据行进行替换.删除.新增.选取等特定工作. Sed本质上是一个编辑器,但是它是非交互式的,这点与VIM不同:同时 ...

  6. [转]sed命令详解

    转载:http://blog.chinaunix.net/u/22677/showart_1076318.html   1.简介 sed是非交互式的编辑器.它不会修改文件,除非使用shell重定向来保 ...

  7. sed命令

    sed是一个很好的文件处理工具,本身是一个管道命令,主要是以行为单位进行处理,可以将数据行进行替换.删除.新增.选取等特定工作,下面先了解一下sed的用法sed命令行格式为:         sed ...

  8. sed 命令使用

    ios 的sed 命令 跟linux  sed 命令有区别 # 所有的a 替换成b sed -i "" 's/a/b/g' #删除掉所有包含a的行 sed -i "/a/ ...

  9. sed命令给文本文件的每行的行首或者行尾添加文字

    在每行的头添加字符,比如"HEAD",命令如下: sed 's/^/HEAD&/g' test.file 在每行的行尾添加字符,比如“TAIL”,命令如下: sed 's/ ...

  10. Linux的sed命令

    一.初识sed 在部署openstack的过程中,会接触到大量的sed命令,比如 # Bind MySQL service to all network interfaces.sed -i 's/12 ...

随机推荐

  1. linux文本处理命令 一

    1,cut 主要的用途在于将同一行里面的数据进行分解 cut -d ‘分隔符’ -f   ‘第几段’   和-f同时使用 -c    字符区间  截取字符区间 2,grep   cut 是在一行讯息当 ...

  2. 老司机带带我,FIFO不简单

    FIFO,没有想象的那么简单! 根据一般的原则,FIFO这件事情啊,如果能用IP先别自己手写.可以通过FPGA厂家的的IP生成工具生成相应的FIFO. FIFO中的格雷码: 格雷码应用于异步FIFO的 ...

  3. GOF23设计模式之中介者模式(mediator)

    一.中介者模式概述 如果一个系统中对象之间的联系呈现网状结构,对象之间存在大量多对多的关系,导致关系及其复杂,这时可以引入一个中介者对象,使得各个对象只跟中介者对象打交道,从而将复杂的网络结构化为星型 ...

  4. appium+python自动化30-list定位(find_elements)

    前言 有时候页面上没有id属性,并且其它的属性不唯一,平常用的比较多的是单数(element)的定位方法,遇到元素属性不唯一,就无法直接定位到了. 于是我们可以通过复数(elements)定位,先定位 ...

  5. Vim编辑器基本操作学习(一)

      最近在服务端编辑文件总不可避免要使用vim编辑器,下面就对学习到的常用命令进行总结,以便自己以后查看.   基本编辑命令   删除字符:x 删除一行:dd 删除换行符:J,同时将两行合并成一行 撤 ...

  6. 第十一章 Helm-kubernetes的包管理器(中)

    11.5 chart详解 chart由一系列文件组成,这些文件描述了K8s部署应用时需要的资源,比如Servcie.Deployment.PersistentVolmeClaim.Secret.Con ...

  7. python学习 (三十四) Python文件操作

    1 写文件 my_list = ["] my_file = open("myfile.txt", "w") for item in my_list: ...

  8. canvas之抒写文字

    <canvas id="canvas" width="500" height="400" style="background ...

  9. 缓存varnish的管理及配置详解

    一 工作原理 在当前主流的Web服务架构体系中,Cache担任着越来越重要的作用.常见的基于浏览器的C/S架构,Web Cache更是节约服务器资源的关键.而最近几年由FreeBSD创始人之一Kamp ...

  10. OD 实验(十八) - 简单注册机的编写

    程序: 运行 这是一个注册机 随便输入点内容,点击 Check 弹出错误的对话框 逆向: 用 OD 载入程序 在文本框处下断点 按 Alt+B 查看断点 这个断点在动态链接库那里 跑一下程序,输入内容 ...