cat file:test{
admin:111
index:aaa
admin:111
}
normal{
admin:3333
index:bbb
admin:3333
}
test{
admin:111
index:ccc
admin:111
}
要求打印 test 段落里的 index 后面的值:
aaa
ccc
- sed '/^test{/{:a;N;/index/!{z;ba};s/.*://p};d' file
[解析]
命令中的 z 是关键,这是 GNU sed 的扩展功能,它的作用和 s/.*// 是等价的,就是清空 pattern space 里的内容,在这里我们从匹配到 test{ 开始的,N 读取下一行,如果没有匹配到 index 内容就清空 pattern space ,并跳转到标签 a 处,继续 N 读取下一行内容,一直读到包含 index 关键字的内容,把冒号以前的都替换掉,就只剩 index 后面的值了,然后打印出来。该功能只在 GNU sed 4.2 版本后才支持。 这是官方文档。
- sed -n '/^test{/{:a;n;/index/!ba;s/.*://p}' file
[解析]
其实 n 也可以实现往下的操作,特别注意的是 n 将操作转至下一行的同时,会默认输出 pattern space 里的内容,所以这里必须加 -n 参数,默认不打印 pattern space 里的内容。
- awk -F":" '/test{/{i=1};i&&/index/{print $2;i=0}' file
[解析]
awk也是可以的,用一个变量来确定。
阅读(2599) | 评论(0) | 转发(0) |