【转】 SED多行模式空间
1、
sed执行模板=sed '模式{命令1;命令2}'
即逐行读入模式空间,执行命令,最后输出打印出来
2、
为方便下面,先说下p和P,p打印当前模式空间内容,追加到默认输出之后,P打印当前模式空间开端至\n的内容,并追加到默认输出之前。
sed并不对每行末尾\n进行处理,但是对N命令追加的行间\n进行处理,因为此时sed将两行看做一行。
2-1、n命令
n命令简单来说就是提前读取下一行,覆盖模型空间前一行(并没有删除,因此依然打印至标准输出),如果命令未执行成功(并非跳过:前端条件不匹配),则放弃之后的任何命令,并对新读取的内容,重头执行sed。
例子:
从aaa文件中取出偶数行
|
1
2
3
4
5
6
7
8
9
10
|
cat aaa This is 1 This is 2 This is 3 This is 4 This is 5 sed -n 'n;p' aaa //-n表示隐藏默认输出内容 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命令。
因此,最终打印出来的就是偶数行。
2-2、N命令
N命令简单来说就是追加下一行到模式空间,同时将两行看做一行,但是两行之间依然含有\n换行符,如果命令未执行成功(并非跳过:前端条件不匹配),则放弃之后任何命令,并对新读取的内容,重头执行sed。
例子:
从aaa文件中读取奇数行
|
1
2
3
4
5
6
7
8
9
10
11
|
cat aaa This is 1 This is 2 This is 3 This is 4 This is 5 sed -n '$!N;P' aaa This is 1 This is 3 This is 5 |
注释中1代表This is 1 2代表This is 2 以此类推
注释:读取1,$!条件满足(不是尾行),执行N命令,得出1\n2,执行P,打印得1,读取3,$!条件满足(不是尾行),执行N命令,得出3\n4,执行P,打印得3,读取5,$!条件不满足,跳过N,执行P,打印得5
2-3、d命令
d命令是删除当前模式空间内容(不在传至标准输出),并放弃之后的命令,并对新读取的内容,重头执行sed。
d命令例子
从aaa文件中取出奇数行
|
1
2
3
4
5
6
7
8
9
10
11
|
cat aaa This is 1 This is 2 This is 3 This is 4 This is 5 sed 'n;d' aaa This is 1 This is 3 This is 5 |
注释:读取1,执行n,得出2,执行d,删除2,得空,以此类推,读取3,执行n,得出4,执行d,删除4,得空,但是读取5时,因为n无法执行,所以d不执行。因无-n参数,故输出1\n3\n5
2-4、D命令
D命令是删除当前模式空间开端至\n的内容(不在传至标准输出),放弃之后的命令,但是对剩余模式空间重新执行sed。
D命令例子
从aaa文件中读取最后一行
|
1
2
3
4
5
6
7
8
9
|
cat aaa This is 1 This is 2 This is 3 This is 4 This is 5 sed 'N;D' aaa This is 5 |
注释:读取1,执行N,得出1\n2,执行D,得出2,执行N,得出2\n3,执行D,得出3,依此类推,得出5,执行N,条件失败退出,因无-n参数,故输出5
2-5、y命令
y命令的作用在于字符转换
y命令例子:
将aaa文件内容大写
|
1
2
3
4
5
6
|
sed 'y/his/HIS/' aaa THIS IS 1 THIS IS 2 THIS IS 3 THIS IS 4 THIS IS 5 |
此外,如果需要对某个字符串进行大小写转换,则可使用如下方法
|
1
2
3
4
5
6
7
8
9
10
11
12
13
|
cat 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 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 |
2-6、h命令,H命令,g命令,G命令
h命令是将当前模式空间中内容覆盖至保持空间,H命令是将当前模式空间中的内容追加至保持空间
g命令是将当前保持空间中内容覆盖至模式空间,G命令是将当前保持空间中的内容追加至模式空间
命令例子:
将ddd文件中数字和字母互换,并将字母大写
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
cat ddd.sedh { 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,执行h,复制到保持空间,执行s,模式空间得到匹配到的字母a,然后执行y,将a转成A,执行G,追加保持空间内容到模式空间,得
A\nThis is a and a is 1;执行s,重新排列,得出This is 1 and 1 is A;以此类推,得出结果。
这里需要注意的是匹配的内容中,空格一定要处理好,空格处理不对,会造成第二次s匹配错误,无法执行重新排列或排列错误
2-7、x命令
x命令是将当前保持空间和模式空间内容互换
转自:http://hi.baidu.com/aaa103439/item/dbaa6d0d27b4f812cc34eab8
【转】 SED多行模式空间的更多相关文章
- 【转】SED多行模式空间
在前面看到的都是单行模式.每次sed处理一个行. 但是sed是允许一次处理多行的.这就是所谓的多行模式空间. 多行模式空间命令有(N.D.P),他们分别对应单行模式空间(n.d.p). 分别是他们的多 ...
- 【shell】sed指定追加模式空间的次数
最近遇到一个文本复制的场景,需要把文本的每一行都重复输出三次. 这个用awk或者sed实现都还是很简单的. sed代码: [root]$ seq | sed '{h;G;G}' 现在的问题是,如果每行 ...
- sed高级用法:模式空间(pattern space)和保持空间(hold space)
摘自:https://blog.csdn.net/ITsenlin/article/details/21129405 sed高级用法:模式空间(pattern space)和保持空间(hold spa ...
- 借个例子说明sed的模式空间,以及针对模式空间的N,P,D用法
下面是我们要处理的文本:题目要求是把所有散列在不同行的同一个中括号中的数据集中在一起, 见下表就秒懂了吧 处理前的文本 处理后的文本 [123456][ASDEF][ABCD123WF][789ADC ...
- 通过几个例子看sed的模式空间与保持空间
SED之所以能以行为单位的编辑或修改文本,其原因在于它使用了两个空间:一个是活动的“模式空间(pattern space)”,另一个是起辅助作用的“暂存缓冲区(holdingspace)这2个空间的使 ...
- sed的模式空间和保持空间
摘自:https://blog.csdn.net/wanglelelihuanhuan/article/details/51591809 sed的模式空间和保持空间 2016年06月06日 17:15 ...
- sed原理及sed命令格式 ,缓存区,模式空间
4.1 Sed工作原理 sed是一个非交互式的流编辑器.所谓非交互式,是指使用sed只能在命令行下输入编辑命令来编辑文本,然后在屏幕上查看输出:而所谓流编辑器,是指sed每次只从 ...
- sed 模式空间 保持空间
sed之所以能以行为单位的编辑或修改文本,其原因在于它使用了两个空间:一个是活动的"模式空间(pattern space)",另一个是起辅助作用的"保持空间(hold s ...
- sed 之 模式空间 & 保持空间
模式空间:容纳当前输入行的缓冲区: 保持空间:作为辅助的一个缓冲区,可以和模式空间进行交互,但是命令不能直接作用于保持空间. 由上面定义可以知道,模式空间和保持空间是两个独立的缓冲区,可以进行交互,命 ...
随机推荐
- js对象,set和get方法 的三种实现形式
var obj1 = { name: 'shaanxi', get nameGet() { return this.name + 'a'; }, set nameSet(name) { this.na ...
- [转]Python 资源大全中文版
摘自:https://github.com/jobbole/awesome-python-cn 我想很多程序员应该记得 GitHub 上有一个 Awesome - XXX 系列的资源整理.awesom ...
- Java集合源码分析(四)HashMap
一.HashMap简介 1.1.HashMap概述 HashMap是基于哈希表的Map接口实现的,它存储的是内容是键值对<key,value>映射.此类不保证映射的顺序,假定哈希函数将元素 ...
- H5基础浏览器兼容性
<!DOCTYPE HTML><html><body> <video width="320" height="240" ...
- solr服务的搭建(以solr4.1实现)
1.准备工作:一个干净的Tomcat,solr-4.10.3. 2.新建一个文件夹我这里命名为solr,将Tomcat和solr-4.10.3放进去.新建一个solrhome的文件夹,里面放的是sol ...
- Dockerfile中CMD和ENTRYPOINT的区别
当启动一个容器时,CMD和ENTRYPOINT都可以用来执行启动命令.但它们的具体用法还是有一些区别: 1. Dockerfile必须至少指定CMD或者ENTRYPOINT其中的一个. 2. ENTR ...
- TypeScript和Node模块解析策略
一般我们在模块化编码时,总会导入其它模块,通常我们使用如下语法: import { A } from './a'; // ES6语法 import { A } from 'a'; var A = re ...
- 基于 fireasy 构建的 asp.net core 示例
最近花时间弄了一个关于fireasy使用的demo,已放到 github 上供大家研究,https://github.com/faib920/zero 该 demo 演示了如何使用 fireasy 创 ...
- 全国银行列表json格式
var list=[ { value:'CDB', text:'国家开发银行' }, { value:'ICBC', text:'中国工商银行' }, { value:'ABC', text:'中国农 ...
- Win7如何分享局域网并设置共享文件夹账户和密码
https://jingyan.baidu.com/article/ceb9fb10ddf6c08cad2ba017.html 在办公或者其他场所,我们需要分享自己的文件给朋友或者同事,但又不想同一局 ...