1)

文本:

Handle 0x0058, DMI type 20, 19 bytes
Memory Device Mapped Address
        Starting Address: 0x0001FFFFC00
        Ending Address: 0x0001FFFFFFF
        Range Size: 1 kB
        Physical Device Handle: 0x0047
        Memory Array Mapped Address Handle: 0x004B
        Partition Row Position: Unknown
        Interleave Position: Unknown
        Interleaved Data Depth: Unknown

sample 0x0058, DMI type 20, 19 bytes
Memory Device Mapped Address
        Starting Address: 0x0001FFFFC00
        Ending Address: 0x0001FFFFFFF
        Range Size: 2 kB
        Physical Device Handle: 0x0047
        Memory Array Mapped Address Handle: 0x004B
        Partition Row Position: Unknown
        Interleave Position: Unknown
        Interleaved Data Depth: Unknown

Handle 0x0058, DMI type 20, 19 bytes
Memory Device Mapped Address
        Starting Address: 0x0001FFFFC00
        Ending Address: 0x0001FFFFFFF
        Range Size: 3 kB
        Physical Device Handle: 0x0047
        Memory Array Mapped Address Handle: 0x004B
        Partition Row Position: Unknown
        Interleave Position: Unknown
        Interleaved Data Depth: Unknown
要求:每个段落是Handle开头的就取出Range Size的值:
1 kB
3 kB



  1. sed -n '/^Handle/{:a;N;/\n$/!{$!ba};s/.*Range Size: \([^\n]*\).*/\1/p}' file
[解析]
文本就3个段落,2个空行为分割,用sed首先想到肯定是以空行为分割,把一整段文本读取在一起,然后统一进行匹配和替换,特别注意N读取内容匹配空行是 /\n$/ ,而不是一般的 /^$/  ,另一个问题是到了尾行因为没有下面的空行来激活,所以我们要在前面加个尾行的匹配跳转。这样就可以成功替换以Handle开头的段落内容,如果没匹配到也当然不会打印。


  1. sed -n 'H;/^$/!{$!b};x;s/\nHandle.*Range Size: \([^\n]*\).*/\1/p' file
[解析]
因为是以空行为分割,H 追加到 hold space ,后面的替换只对空行或者最后一行才执行,否则都会跳过,也只有符合关键字的才会被替换打印。其他的行则因为 -n 的原因不会被输出。



最后再附上awk的命令:
  1. awk -vRS= -F"\n" '/^Handle/{split($5,a,": ");print a[2]}' file



2)

文本:
dn: identifier=1
objectClass: ZcValidRecord
DsId: 2
identifier:2955
subOptionName: Record
SvcId: 1
ZoneId: 0

dn: identifier=2
objectClass: ZcValidRecord
DsId: 2
identifier:2956
subOptionName: Record
SvcId: 2
ZoneId: 0

要求后面的数字替换前面的数字:
dn: identifier=2955
objectClass: ZcValidRecord
DsId: 2
identifier:2955
subOptionName: Record
SvcId: 1
ZoneId: 0

dn: identifier=2956
objectClass: ZcValidRecord
DsId: 2
identifier:2956
subOptionName: Record
SvcId: 2
ZoneId: 0



  1. sed ':a;N;/\n$/!{$!ba};s/\([^0-9]*\)[0-9]*\(.*identifier:\)\([0-9]*\)/\1\3\2\3/' file
[解析]
初一看这题觉得不难,就是简单的数字替换,关键就在于数字的位置,我们都知道不管是shell还是awk还是sed,它都是逐行执行的,换句话说,执行到后面的行后,就不可能再对前面的行进行修改,这个跟我们往常的前面匹配修改后面的内容不一样,这里我们利用sed,把内容统一读取后,用正则来匹配修改它。这里还有另外两个要点,第一,文本是以空行为段落分割,在N读取模式中匹配空行不能再是传统的 /^$/ ,而是 /\n$/ ,这点上特别注意,第二,针对空行触发条件,到了文件末尾时,没有空行来触发,所以要依据文件末行来触发替换,这里就有了两个标签跳转。



  1. sed -n '1h;/^$/!{1!H;$!b};x;s/\([^0-9]*\)[0-9]*\(.*identifier:\)\([0-9]*\)/\1\3\2\3/p' file
[解析]
这是 h;H 的搭配;道理也是一样把一个段落读入 hold space 里,再出发条件统一替换。

sed之h;H和:a;N;ba使用精解(对段落进行操作)的更多相关文章

  1. sed,n,N,d,D,p,P,h,H,g,G,x,解析

    原文地址 这篇文章主要是我参考命令的,直接复制粘贴,有问题请拍砖 A. sed执行模板=sed '模式{命令1;命令2}' 即逐行读入模式空间,执行命令,最后输出打印出来 B. p打印当前模式空间所有 ...

  2. 如何理解render: h => h(App)

    学习vuejs的时候对这句代码不理解 new Vue({ el: '#app', router, store, i18n, render: h => h(App) }) 查找了有关资料,以下为结 ...

  3. vue-cli: render:h => h(App)是什么意思

    import Vue from 'vue' import App from './App.vue' Vue.config.productionTip = false new Vue({ render: ...

  4. SecureCRT中sqlplus,使用Backspace删除时 ^H^H

    平时习惯用Backspace删除输入错误,但是在SecureCRT中使用是,却是: SQL> sele^H^H 网上有几个方法,觉得改SecureCRT的配置最方便.

  5. 关于Vue中的 render: h => h(App) 具体是什么含义?

    render: h => h(App) 是下面内容的缩写: render: function (createElement) { return createElement(App); } 进一步 ...

  6. 解析vue2.0中render:h=>h(App)的具体意思

    render:h=>h(App)是ES6中的箭头函数写法,等价于render:function(h){return h(App);}. 注意点:1.箭头函数中的this是 指向 包裹this所在 ...

  7. render:h => h(App) 是什么意思?

    在学习vue.js时,使用vue-cli创建了一个vue项目,main.js文件中有一行代码不知道什么意思.在网上搜索得到如下解答: 参考一:https://www.cnblogs.com/longy ...

  8. Vue2.0 render:h => h(App)

    new Vue({ router, store, //components: { App } vue1.0的写法 render: h => h(App) vue2.0的写法 }).$mount( ...

  9. Vue中render: h => h(App)的含义

    // ES5 (function (h) { return h(App); }); // ES6 h => h(App); 官方文档 render: function (createElemen ...

随机推荐

  1. SAE部署Python-让云端自动运行Python代码

    之前写过模拟登录新浪微博的帖子,然而我并没有去爬过微博的数据,觉得有点浪费,于是就想写一个代码来发微博.写完之后觉得如果能自动发微博就好了,但是我又不可能24小时开始(晚上12点后还会断网),也没有v ...

  2. AtCoder Grand Contest 012 A

    A - AtCoder Group Contest Time limit : 2sec / Memory limit : 256MB Score : 300 points Problem Statem ...

  3. Counting The Important Pairs CodeChef - TAPAIR

    https://vjudge.net/problem/CodeChef-TAPAIR 合法的删除方法: 第一种:桥边与其余任意边(1)桥*(桥-1)/2(两条桥边)(2)桥*(m-桥)(桥边+其他边) ...

  4. Maxim Buys an Apartment CodeForces - 854B

    题意:已知一条街上有n幢房子,依次的编号为1~n,其中有k幢已经卖出去了但是不知道是哪k幢.当且仅当一幢房子没有卖出去且其两旁至少有一幢房子卖出去了的时候,认为这幢房子是好的.问这n幢房子中好的房子最 ...

  5. 题解报告:hdu 2141 Can you find it?(二分)

    Problem Description Give you three sequences of numbers A, B, C, then we give you a number X. Now yo ...

  6. 165 Compare Version Numbers 比较版本号

    比较两个版本号 version1 和 version2.如果 version1 大于 version2 返回 1,如果 version1 小于 version2 返回 -1, 除此以外 返回 0.您可 ...

  7. Spring------自动化装配Bean(三)

    上一篇是基于java手动装配bean的实现,这一篇将通过xml手动装配bean来实现. xml配置相对于java配置有点: xml配置更加快捷 但不宜扩展 一.打开application.xml 1. ...

  8. grunt配置详情

    这个grunt配置 是我的一个程序员朋友从网上无意间看到的,然后他亲测了下,恩,是可以的.不过我到目前还未测试过是否可以. 一.安装node, 首先确保电脑已有node的环境.然后 运行  npm i ...

  9. a=a+b与a+=b的区别

    在一次工作中身边的一位资深的同事突然问了个a=a+b与a+=b有什么区别 此时有点尴尬了 不知道是真的不知道咧还是别有用意....今天抽点时间针对此问题做个小总结 一.性能方面 a=a+b是加法运算 ...

  10. 如何修改站点url

    1.config目录下的config_global.php 文件,修改:$_config['cookie']['cookiedomain'] = '.xxxxx.com';2.config目录下的co ...