LinuxSir.cn,穿越时空的Linuxsir!

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

grep如何实现匹配两个字符串任意一个

[复制链接]
发表于 2007-4-16 11:15:44 | 显示全部楼层 |阅读模式
我希望能实现 在第8字符位置开始匹配 9020或9026 其中之一。
现在的代码是:grep '^.\{7\}9020\{1\}.*' "/home/data123.file"
                     grep  '^.\{7\}9026\{1\}.*' "/home/data123.file"

怎样能把他们写成一个shell命令呢?
请高手指点。。。
在线等待回复。。。 谢谢了
 楼主| 发表于 2007-4-16 11:53:48 | 显示全部楼层
版主  帮帮忙。
回复 支持 反对

使用道具 举报

发表于 2007-4-16 12:01:46 | 显示全部楼层
grep -E '^.{7}9020{1}.*|^.{7}9026{1}.*'
回复 支持 反对

使用道具 举报

发表于 2007-4-16 12:48:33 | 显示全部楼层
grep -E '^.{7}902[06]'
回复 支持 反对

使用道具 举报

 楼主| 发表于 2007-4-16 13:26:49 | 显示全部楼层
Post by kangkang
grep -E '^.{7}9020{1}.*|^.{7}9026{1}.*'

像这样写 如果类似9020 9026 的值太多的话, 命令就太长了。
能不能写在一个正则表达式里面呢?  

不能写成902[06], 因为9020 9026这整个值都是个变量,可能是1020 5050 等。
所以再次请教  谢谢。
回复 支持 反对

使用道具 举报

发表于 2007-4-16 13:42:01 | 显示全部楼层
你是说这个9020之类是可能会变的是吧。
那这样吧:

  1. #!/bin/bash
  2. a="^.{7}$1"
  3. shift
  4. while [ $# -gt 1 ]
  5. do
  6.     a="$a|^.{7}$1"
  7.     shift
  8. done
  9. grep -E "$a" "$1"
复制代码

使用方法
run 9020 9026 1020 ..... 文件名
回复 支持 反对

使用道具 举报

 楼主| 发表于 2007-4-16 13:49:06 | 显示全部楼层
OK  
谢谢。

我发现另一种简洁一点的方法
一种:grep -E '^.{7}9026{1}.*|^.{7}9020{1}.*' "/home/12.file"

二种:grep -E '^.{7}(9026|9020){1}.*' "/home/12.file"
回复 支持 反对

使用道具 举报

发表于 2007-4-16 15:12:55 | 显示全部楼层
呵呵,学到了shift,有意思。
回复 支持 反对

使用道具 举报

发表于 2007-4-21 17:30:14 | 显示全部楼层
Post by Iambitious
呵呵,学到了shift,有意思。

我也是,以前看书时看到过,但从来没用过,呵呵。
回复 支持 反对

使用道具 举报

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

本版积分规则

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