sed -n 'G; s/\\n/\u0026\u0026/; /^\\([ -~]*\\n\\).*\\n\\1/d; s/\\n//; h; P'是怎样实现删除重复行的
这个正则表达式挺简单,就是简单匹配aba这种形式,不是这句sed的重点。首先,这句语句可以先简化一下,前面复制第一个换行符和后面清理换行符应该是为了保留唯一空行用的,先将整个语句简化为:sed -n \u0026#39;G; /^\\(.*\\\).*\\\1/d; h; P\u0026#39;主要要理解的就是sed中的两个空间,pattern space和hold space。sed的输入逐行读入pattern space,每次读入时会清空pattern space。hold space是一个备用的空间。在这个语句中,hold space中存放所有非重复的行。整个sed大循环过程如下:1. 每次读入一个新行时,将hold space中的内容添加到pattern space中。2. 然后在pattern space中检查正则表达式;2.1 如果匹配到就清空pattern space,然后不执行后面代码直接读取新行,回到12.2 如果没有匹配到就把当前整个的pattern space复制到hold space中,同时输出当前pattern space中的第一行伪码如下:read_one_line () {\tclear_pattern_space ();\treturn read_one_line_from_flle ();}while (read_one_line () != EOF) {\tappend_with_hold_space ();\tif (check_dup_in_pattern_space ()) {\t\tcontinue;\t}\t\tcopy_to_hold_space ();\tdisplay_first_line_of_pattern_space ();}举个简单例子:1, 2, 3, 2, 4: pattern space hold space stdoutinit: NULL NULLstart: 1 NULLG: 1 NULLh: 1 1 1start: 2 1G: 2\1 1h: 2\1 2\1 2start: 3 2\1G: 3\2\1 2\1h: 3\2\1 3\2\1 3start: 2 3\2\1G: 2\3\2\1 3\2\1d: NULL 3\2\1start 4 3\2\1G: 4\3\2\1 3\2\1h: 4\3\2\1 4\3\2\1 4EOF.使用代码验证cat aaa12324sed -n \u0026#39;G; /^\\(.*\\\).*\\\1/d; h; P\u0026#39; aaa (stdout)1234sed -n \u0026#39;p; G;/^\\(.*\\\).*\\\1/d; h\u0026#39; aaa (G前的pattern space)12324sed -n \u0026#39;G; p; /^\\(.*\\\).*\\\1/d; h\u0026#39; aaa (G后的pattern space)12132123214321sed -n \u0026#39;G;/^\\(.*\\\).*\\\1/d; h; x; p; x\u0026#39; aaa (hold space)1213214321
■网友
先给个搜到的讲解http://hi.baidu.com/asnahu/item/88a273e1508d9fb72f140b89 G是把hold 区的内容追加到当前行s/\/\u0026amp;\u0026amp;/; /^\\(*\\\).*\\\1/d; s/\// 正确的是( 去掉了带-和~的行不检查重复的限制) s/\/\u0026amp;\u0026amp;/; /^\\(.*\\\).*\\\1/d; s/\// 意思是如果有重复行,则继续下一个循环;相当于break;我想改个使用“环视语法”的方法,没改出来h是把current区复制到hold区P是打印current区(manual是这样说的),但是G命令追加的东西缺没打印出来。不知道这个是哪本书的题目,这句写得相当严谨。另一方面让我认识到,sed和正则表达式不合适做太复杂的任务,比如删除重复行这个。
■网友
话说为什么不用sort -u
■网友
^\\(*\\\)表示一行,.*\表示以回车为结尾的中间部分,\\1表示和前面括号里相同的一行。
推荐阅读
- 聪明人养花,这3种“花”怎样也要养一盆,每年能省不少医药费
- 互联网怎样解决“家政服务上门速度慢”的问题
- 怎样看待从1月8号起,QQ钱包开始提现收费
- 银行it人怎样转型
- 汽车|冬天怎样让车内温度快速升高?座椅加热的最佳使用方式二,外循环的作用总结
- 怎样进入通信行业
- 怎样评价扶他柠檬茶的小说《云养汉》的结尾
- 怎样成为一名合格的Python程序员?
- 怎样评价华为、诺基亚、中兴中标中国移动高端路由交换设备扩容集采
- 怎样评价类似前橙会、百老汇、南极圈这样类型的离职帮抱团,对企业的积极意义和消极意义
