Chinaunix

标题: 正则问题--包含abc但不能包含abc后面的xyz [打印本页]

作者: 勒色    时间: 2012-06-26 16:58
标题: 正则问题--包含abc但不能包含abc后面的xyz
本帖最后由 勒色 于 2012-06-26 17:08 编辑

请教一个正则表达式的问题,我不知道正则表达式的问题发到这里是不是合适,如果发错,请管理员帮忙移动吧,谢谢。

我希望输出包含abc的行,但是abc后面不能包含xyz,abc前面是否包含xyz不限制。

原文:
123abc3456
adfadabcadfadfxyz
35rf-mhusabc9ke8qdnca
abc_xyzienmadnfd
adaqwtrqwerzcvsgyq4teaf
123413513598458923
!$@&#($)$^^&*(*^%$#@@
23xyzdafigabce931

希望输出:
123abc3456
35rf-mhusabc9ke8qdnca
23xyzdafigabce931


多谢各位了。
作者: jiaogeshahaone    时间: 2012-06-26 17:02
回复 1# 勒色


    abc_defienmadnfd
也不要?
作者: 勒色    时间: 2012-06-26 17:05
本帖最后由 勒色 于 2012-06-26 17:06 编辑

回复 2# jiaogeshahaone

对,只要abc后面包含了zyz就不要


不好意思,前面我的原文帖的有问题,现在已经修改了
作者: personball    时间: 2012-06-26 17:09
  1. personball@vostro:SHELL$cat file
  2. 123abc3456
  3. adfadabcadfadfxyz
  4. 35rf-mhusabc9ke8qdnca
  5. abc_xyzienmadnfd
  6. adaqwtrqwerzcvsgyq4teaf
  7. 123413513598458923
  8. !$@&#($)$^^&*(*^%$#@@
  9. 23xyzdafigabce931
  10. personball@vostro:SHELL$grep "abc" file|grep -v -E "abc.*xyz+"
  11. 123abc3456
  12. 35rf-mhusabc9ke8qdnca
  13. 23xyzdafigabce931
复制代码

作者: 勒色    时间: 2012-06-26 17:17
有没有办法写成一个正则表达式?我是希望用在代码里面的。
研究了好久,我大概(abc).*(?!xyz).*?这样的思路,但是最终我没有实现
作者: ziyunfei    时间: 2012-06-26 18:55
本帖最后由 ziyunfei 于 2012-06-26 18:57 编辑
  1. grep -P 'abc(.(?!xyz))*$'
复制代码

作者: rdcwayx    时间: 2012-06-26 19:46
本帖最后由 rdcwayx 于 2012-06-26 19:46 编辑
  1. awk '/abc/&&!/abc.*xyz/' infile
复制代码

作者: 勒色    时间: 2012-06-26 20:17
发现必须要使用特定的语言环境下的正则表达式,多谢各位了
作者: 勒色    时间: 2012-06-26 20:19
我打算再研究下,有没有不依赖语言的正则表达式写法。
现在正在研究Expresso这个工具
作者: qishking    时间: 2012-06-26 21:50

为什么屏幕上没有输出,重定向到文件却有内容?
作者: cdtits    时间: 2012-06-26 21:56
本帖最后由 cdtits 于 2012-06-26 21:56 编辑

cat asdf.txt | perl -ne 'print if /abc(.(?!xyz))*\b/'
作者: yinyuemi    时间: 2012-06-26 22:15
回复 1# 勒色

建议用awk
  1. awk -vFS="abc" '$2!~/xyz/&&NF==2'
复制代码

作者: lmzopq    时间: 2012-06-26 23:25
abc(?!.*xyz.*)
作者: abcd5610    时间: 2012-06-27 10:16
回复 4# personball


    "abc.*xyz+" 的.是什么意思 求解惑。。。。
作者: personball    时间: 2012-06-27 10:24
回复 14# abcd5610


    正则表达式相关资料随便查查就知道了
给你个百度百科传送门:http://baike.baidu.com/view/94238.htm
作者: freeterman    时间: 2012-06-27 10:39
grep -P '.*abc.*(?!xyz).*' infile

这个测试一下
结果:
[root@localhost ~]# grep -P '.*abc.*(?!xyz).*' txt
123abc3456
adfadabcadfadfxyz
35rf-mhusabc9ke8qdnca
abc_xyzienmadnfd
23xyzdafigabce931
personball@vostro:SHELL$grep "abc" file|grep -v -E "abc.*xyz+"
123abc3456
35rf-mhusabc9ke8qdnca
23xyzdafigabce931
作者: abcd5610    时间: 2012-06-27 10:51
回复 15# personball

.*是不是就是匹配任意个的单个字符呢?

   
作者: cjaizss    时间: 2012-06-27 11:08
标准的正则表达式写不出,perl的据说可以写
作者: sunceenjoy    时间: 2012-06-27 11:33
我也弄一下:
sed -re -n '/abc/{/abc.*xyz/!p}' 2.txt
作者: xiaowh00    时间: 2012-06-27 12:03
不知道这是不是你要的,最近在看《Mastering.Regular.Expressions》

[root@pt10 ~]#  grep -P 'abc(?!.*xyz)' a --color
123abc3456
35rf-mhusabc9ke8qdnca
23xyzdafigabce931
[root@pt10 ~]#
[root@pt10 ~]# cat a
123abc3456
adfadabcadfadfxyz
35rf-mhusabc9ke8qdnca
abc_xyzienmadnfd
adaqwtrqwerzcvsgyq4teaf
123413513598458923
!$@&#($)$^^&*(*^%$#@@
23xyzdafigabce931

回复 1# 勒色


   
作者: freeterman    时间: 2012-06-27 12:36
上面搞错了
应该是grep -P 'abc(.(?!xyz))*$' txt




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