免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12
最近访问板块 发新帖
楼主: polestar_li
打印 上一主题 下一主题

为什么grep -n "^[^#]" file会把空行也剔除掉 [复制链接]

论坛徽章:
2
射手座
日期:2014-10-10 15:59:4715-16赛季CBA联赛之上海
日期:2016-03-03 10:27:14
11 [报告]
发表于 2012-05-01 01:34 |只看该作者
回复 8# polestar_li
  1. ^ 和 $ 表示位置,不占字符数,

  2. ^[^#]里的[^#]代表一个非'#'的字符(排除空行,因为空行没有字符存在),加上前面的'^',表示这个非'#'的字符必须在行首(排除注释行)
复制代码

论坛徽章:
0
12 [报告]
发表于 2012-05-02 14:29 |只看该作者
回复 11# yinyuemi

关键应该是在于sed、grep等流编辑工具对行结尾符的理解,它们认为记录行尾的"$"就是标记新行的开始,不认为它在正则表达式的字符匹配范围内
换句话所就是sed、grep等不将换行符作为常规字符对待,仅视为文档标记,类似于C语言中会有文件结束符"EOF".

现在一些较高版本的sed、awk对字符串内嵌的换行符也是支持的,但无一例外的,对它们所定义分隔出的记录而言,必须有一个被视作记录结束的标记符,不是自定义的就是默认的"$"
这些被当做记录结束的标记字符如果出现在记录结尾它将被特殊对待.

明白这点后,对于"^[^#]"匹配不到空行也就好理解了,因为空行中没有可匹配的字符,仅仅有一个行位置标记符而已.
"#"的补集字符中不包含位置标记,所以问题可这样解决:

grep -nE '^[^#]*$'

注: "^[^#]*" 用来匹配非"#"开头但含字符的行
     "^$" 用来匹配空行位置


   

论坛徽章:
0
13 [报告]
发表于 2013-02-20 15:45 |只看该作者
12楼说的最详细,谢谢了。

论坛徽章:
0
14 [报告]
发表于 2013-03-05 16:21 |只看该作者
chaogle 发表于 2012-05-02 14:29
回复 11# yinyuemi

关键应该是在于sed、grep等流编辑工具对行结尾符的理解,它们认为记录行尾的"$"就是 ...


谢谢,说的很明白。

论坛徽章:
6
摩羯座
日期:2013-08-24 10:43:10狮子座
日期:2013-08-25 10:27:06天秤座
日期:2013-09-11 20:28:44午马
日期:2014-09-28 16:06:0015-16赛季CBA联赛之八一
日期:2016-12-19 13:55:0515-16赛季CBA联赛之天津
日期:2016-12-20 14:01:23
15 [报告]
发表于 2013-03-05 20:58 |只看该作者
本帖最后由 cao627 于 2013-03-05 21:22 编辑

回复 1# polestar_li

    为什么grep -n "^[^#]" file会把里面的空行也剔除掉?而不是只滤掉以#打头的注释行。






这里不要从“过滤”的角度去理解。
要理解为“找出”。
grep -n "^[^#]" file     ##找出非“#”(一个字符)开头的行。


以下为比喻,不是真实命令:
  1. $cat  room
  2. 一个姓张的人
  3. 一台电视
  4. 一个姓王的人

  5. $ find  '一个不是姓王的人'  room    ##find找出:如果有人叫你在房间里找一个不姓王的人,你必然会将姓张的那个人找出来,但不会将电视记也找出来。
  6. 一个姓张的人



  7. $ disappear  '一个不是姓王的人'   room   ##disappear消失:让“一个不是姓王的人”的人从房间里消失。那么姓张的人必然要消失的,但是“一台电视”该不该消失?
  8. 一台电视    ##是消失呢还是不消失?我的理解是不消失,正如楼主从“过滤”的角度理解grep -n "^[^#]" 因该不会过滤掉空行。
  9. 一个姓王的人
复制代码
如上:
一个姓某某的人,相当于一某个普通字符
“一台电视” 相当于空行


您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP