Chinaunix

标题: 为什么grep -n "^[^#]" file会把空行也剔除掉 [打印本页]

作者: polestar_li    时间: 2012-04-30 15:02
标题: 为什么grep -n "^[^#]" file会把空行也剔除掉
我的file文件是从/etc/syslog.conf里面CP出来的,里面包含空行和#打头的注释行,

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

高手指点。
作者: winway1988    时间: 2012-04-30 15:08
  1. grep -nE '^([^#]|$)'
复制代码

作者: polestar_li    时间: 2012-04-30 15:17
回复 2# winway1988


    谢谢,你的很好用,能只剔除#的注释行。

请问用"^[^#]" 这个RE为什么不行吗?为什么会把空行也给过滤掉。因为从RE的规则来解释,"^[^#]" 就是意味找出以非#开头的行的意思吧?????
作者: jason680    时间: 2012-04-30 15:21
回复 1# polestar_li

grep -vP "^\s*#"
   
作者: winway1988    时间: 2012-04-30 15:29
回复 3# polestar_li


    ^[^#] 以一个非"#"的字符开头,那空行呢(^$)
作者: polestar_li    时间: 2012-04-30 16:37
回复 5# winway1988


    空行一般都是以一个$的开头的行,以$开头的行,应该也是非#开头的行吧?如果不是,为什么不是呢?
作者: waker    时间: 2012-04-30 19:56
polestar_li 发表于 2012-04-30 16:37
回复 5# winway1988

这里的$表示行尾
作者: polestar_li    时间: 2012-04-30 21:08
回复 7# waker


    但在空行里面,$也是行头,要不RE里面也不会用^$搜索空行了。

我理解[^#]这个代表是非#的字符,空行是没有字符的,$代表行尾,并不是[]里面代表的字符,如果一行有个Space(空格),而不是连空格没有的空行应该是没有字符的意思。所以才有那样的结果。
作者: zooyo    时间: 2012-04-30 21:16
提示: 作者被禁止或删除 内容自动屏蔽
作者: 惟吾无为    时间: 2012-04-30 21:22
grep -E -n "^[^#]?"
作者: yinyuemi    时间: 2012-05-01 01:34
回复 8# polestar_li
  1. ^ 和 $ 表示位置,不占字符数,

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

作者: chaogle    时间: 2012-05-02 14:29
回复 11# yinyuemi

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

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

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

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

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


   
作者: xiangbei1573    时间: 2013-02-20 15:45
12楼说的最详细,谢谢了。
作者: polestar_li    时间: 2013-03-05 16:21
chaogle 发表于 2012-05-02 14:29
回复 11# yinyuemi

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


谢谢,说的很明白。
作者: cao627    时间: 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. 一个姓王的人
复制代码
如上:
一个姓某某的人,相当于一某个普通字符
“一台电视” 相当于空行







欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2