LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 1579|回复: 6

[已解决]请教shell匹配空行和注释的方法

[复制链接]
发表于 2009-8-28 16:01:41 | 显示全部楼层 |阅读模式
我现在想到的办法是:
sed -e '/^#/d' -e '/^$/d' < bala.c
想用一个正则就匹配完,但是一直没能成功,试过:
sed -e '/^[#$]/d' <bala.c
sed -e '/^(#|$)/d' <bala.c
sed -e '/^(#.*)?$/d' <bala.c
等等都不行。。。
 楼主| 发表于 2009-8-29 14:34:51 | 显示全部楼层
发现一个可以的
sed -e '/^$\|^#/d' <bala.c
不过,为什么用[]会不行呢。。。
回复 支持 反对

使用道具 举报

发表于 2009-8-29 19:36:17 | 显示全部楼层
因为[]内的$匹配的根本就是$字符本身。
回复 支持 反对

使用道具 举报

发表于 2009-8-29 23:44:25 | 显示全部楼层
[]中的$还是元字符, LS再试试?
  1. sed -n '/^[^#$]/p' /etc/fstab
  2. grep '^[^#$]' /etc/fstab
复制代码

实际使用中, 我们可能希望把带空格的“空行”也去掉
  1. grep '^[[:blank:]]*[^#$]' /etc/fstab
复制代码
回复 支持 反对

使用道具 举报

发表于 2009-8-30 10:56:21 | 显示全部楼层
LS错误。

字符组(也就是[]表达式)匹配的是一个字符,而锚点不是字符。实际上,[]内几乎可以看作是定义了一门内嵌在regex里的微微微微语言,很多regex字符不是丢失了元匹配语义,就是赋予了新语义,或者改变了语义。

^[^#$]不会匹配空行,完全是因为:空行根本不包含除linefeed外的任何字符。那么对sed或grep说“给我找这样的行:行首是一个字符,该字符不是#也不是$”,其结果自然不会给你空行——空行行首没有任何字符。
  1. > cat test.txt
  2. 123
  3. #123
  4. $123
  5. > grep '^[#$]' test.txt
  6. #123
  7. $123
  8. >
复制代码
回复 支持 反对

使用道具 举报

发表于 2009-8-31 01:00:36 | 显示全部楼层
嗯, LS正解, 赞
这两天重翻《精通正则表达式》也才注意到[^]这个问题
[^]是实实在在地占了一个字符

P.S.
一楼的sed不成功, 是因为(), |, []等没转义
如果懒得转义, 那就使用扩展正则吧, 如
sed -r '/^(#|$)/d'
回复 支持 反对

使用道具 举报

 楼主| 发表于 2009-9-1 01:16:56 | 显示全部楼层
酱紫,也就是说^[#$]里的$仅仅是个字符而已,已经失掉了其meta-symbol的含义了。于是^[#$]不匹配空行而^(#|$)可以匹配
终于搞明白sed的-e, -r这些参数了,以及-e不使用的时候的副作用
thx
回复 支持 反对

使用道具 举报

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

本版积分规则

快速回复 返回顶部 返回列表