LinuxSir.cn,穿越时空的Linuxsir!

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

grep regexp 问题

[复制链接]
发表于 2009-1-13 08:13:25 | 显示全部楼层 |阅读模式
用equery查package后:
  1. $ equery l scim
  2. [ Searching for package 'scim' in all categories among: ]
  3. * installed packages
  4. [I--] [ ~] app-i18n/scim-1.4.7-r2 (0)
  5. [I--] [ ~] app-i18n/scim-bridge-0.4.15-r3 (0)
  6. [I--] [  ] app-i18n/scim-input-pad-0.1.1 (0)
  7. [I--] [  ] app-i18n/scim-pinyin-0.5.91-r2 (0)
  8. [I--] [ ~] app-i18n/scim-python-0.1.13_rc1-r1 (0)
  9. [I--] [  ] app-i18n/scim-tables-0.5.8-r1 (0)
  10. [I--] [ ~] app-i18n/scim-xingma-0.1.10.1-r2 (0)
复制代码
想用grep来读取中间package名字。
  1. $ equery l scim | grep [[:alnum:]-]?\/
复制代码
这个指令结果是空的。

然后这个直接有错误:
  1. $ equery l scim | grep [[:alnum:]-]*\/
  2. close failed in file object destructor:
  3. Error in sys.excepthook:
  4. Original exception was:
复制代码
为什么?
发表于 2009-1-13 09:02:39 | 显示全部楼层
在 grep 和 regexp间加上 -E的参数,指明用perl的正则表达式。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2009-1-13 11:16:50 | 显示全部楼层
这不是perl regexp的问题。因为man grep下说可以用[:alnum:]之类。

自己解决了,原来要加单引号。不過还有奇怪的地方:
  1. $ equery l scim | grep  -o '[[:alnum:]-]*\/[[:alnum:]\.\_-]*'
  2. app-i18n/scim-1.4.7-r2
  3. app-i18n/scim-bridge-0.4.15-r3
  4. app-i18n/scim-input-pad-0.1.1
  5. app-i18n/scim-pinyin-0.5.91-r2
  6. app-i18n/scim-python-0.1.13_rc1-r1
  7. app-i18n/scim-tables-0.5.8-r1
复制代码

成功!match每一行整行。然而
  1. $ $ equery l scim | grep  '[[:alnum:]-]*\/[[:alnum:]-\.\_]*'
  2. grep: Invalid range end
  3. close failed in file object destructor:
  4. Error in sys.excepthook:

  5. Original exception was:
复制代码

失败!好,我的理解是'-'一定要放在最后一位。不然会被以为是要表达领域。或许要加'\'把,但是:
  1. $ equery l scim | grep  -o '[[:alnum:]\-]*\/[[:alnum:]\-\.\_]*'
  2. app-i18n/scim
  3. app-i18n/scim
  4. app-i18n/scim
  5. app-i18n/scim
  6. app-i18n/scim
  7. app-i18n/scim
复制代码


第一个'\-'成功match到'app-i18n'内的'-',但第二个确没有match到'scim'以后的'-'

可能还是要放最后吧。的确:
  1. $ equery l scim | grep -o '[[:alnum:]\-]*\/[[:alnum:]\.\_\-]*'
  2. app-i18n/scim-1.4.7-r2
  3. app-i18n/scim-bridge-0.4.15-r3
  4. app-i18n/scim-input-pad-0.1.1
  5. app-i18n/scim-pinyin-0.5.91-r2
  6. app-i18n/scim-python-0.1.13_rc1-r1
  7. app-i18n/scim-tables-0.5.8-r1
复制代码


结论
  • 要用单引号
  • 无论是'-'或'\-'都要放最后。
回复 支持 反对

使用道具 举报

发表于 2009-1-14 01:23:01 | 显示全部楼层
你这个问题,用这个办法是不是更漂亮一点
% qlist -Iv xfce4
dev-util/xfce4-dev-tools-4.4.0.1
x11-themes/xfce4-icon-theme-4.4.3
xfce-base/libxfce4mcs-4.4.3
xfce-base/libxfce4util-4.4.3
xfce-base/xfce4-4.4.3
xfce-base/xfce4-panel-4.4.3
xfce-base/xfce4-session-4.4.3
xfce-extra/xfce4-appfinder-4.4.3
xfce-extra/xfce4-battery-0.5.1
xfce-extra/xfce4-clipman-0.8.1
xfce-extra/xfce4-mixer-4.4.3
xfce-extra/xfce4-mount-0.5.5

没明白你的具体要求是什么,似乎是这个,请指教
回复 支持 反对

使用道具 举报

发表于 2009-1-14 07:51:39 | 显示全部楼层
在完成文字过滤这件任务上,用sed好像比用grep更常规点吧。
回复 支持 反对

使用道具 举报

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

本版积分规则

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