求教正则表达式高手

sh/bash/dash/ksh/zsh等Shell脚本
cmdblock
帖子: 307
注册时间: 2008-12-01 7:52
来自: 蜀山

求教正则表达式高手

#1

帖子 cmdblock » 2009-04-13 5:57

我有一个b.txt文件如下
cmdblock@debian:~/dos/bash/test$ cat b.txt
abc 1
abc 20
abc 3 IN
abc 101
我想删除掉 abc 1, abc 20, abc 101,这三个行。执行如下命令
cmdblock@debian:~/dos/bash/test$ cat b.txt | sed '/^abc *[0-9]$/d'
abc 20
abc 3 IN
abc 101
怎么得到的结果不对呢?
这个正则表达式/^abc *[0-9]$/错在哪里?
我对这个正则表达式的理解是:匹配以abc 开头,数字0到9结束的字符串
aerofox
帖子: 1453
注册时间: 2008-05-24 8:30

Re: 求教正则表达式高手

#2

帖子 aerofox » 2009-04-13 6:09

代码: 全选

sed '/^abc \+[[:digit:]]\+$/d' b.txt
a0147520
帖子: 147
注册时间: 2007-10-04 15:23

Re: 求教正则表达式高手

#3

帖子 a0147520 » 2009-04-13 8:21

sed -e '/^abc.*[^0-9]$/d' b.txt
头像
eexpress
帖子: 58428
注册时间: 2005-08-14 21:55
来自: 长沙

Re: 求教正则表达式高手

#4

帖子 eexpress » 2009-04-13 9:45

/^abc *[0-9]$/
空格转义。单数字结束也不对。[0-9]+。至少有一个数字
● 鸣学
头像
qq274980
帖子: 69
注册时间: 2009-04-09 9:16

Re: 求教正则表达式高手

#5

帖子 qq274980 » 2009-04-13 10:20

sed '/^abc.*[0-9]$/d'
头像
qq274980
帖子: 69
注册时间: 2009-04-09 9:16

Re: 求教正则表达式高手

#6

帖子 qq274980 » 2009-04-13 10:22

sed -n '/^abc.*[^0-9]$/p'
头像
qq274980
帖子: 69
注册时间: 2009-04-09 9:16

Re: 求教正则表达式高手

#7

帖子 qq274980 » 2009-04-13 10:23

grep ^abc | grep -v [0-9]$
头像
qq274980
帖子: 69
注册时间: 2009-04-09 9:16

Re: 求教正则表达式高手

#8

帖子 qq274980 » 2009-04-13 10:23

grep ^"abc.*[^0-9]$"
头像
eexpress
帖子: 58428
注册时间: 2005-08-14 21:55
来自: 长沙

Re: 求教正则表达式高手

#9

帖子 eexpress » 2009-04-13 10:24

qq274980 写了:sed '/^abc.*[0-9]$/d'
匹配abcnnnnd0
:em05
● 鸣学
头像
sevk
帖子: 2060
注册时间: 2007-05-08 16:26
系统: arch
来自: 火星内核某分子内某原子核内
联系:

Re: 求教正则表达式高手

#10

帖子 sevk » 2009-04-13 10:49

代码: 全选

irb(main):075:0> a=%Q(abc 1
irb(main):076:0" abc 20
irb(main):077:0" abc 3 IN
irb(main):078:0" abc 101)
=> "abc 1\nabc 20\nabc 3 IN\nabc 101"
irb(main):079:0> puts a; a.each_line{|x| puts x if x !~ /^abc.*\d+$/ )}
abc 1
abc 20
abc 3 IN
abc 101
abc 3 IN
=> "abc 1\nabc 20\nabc 3 IN\nabc 101"
irb(main):080:0> a.each_line{|x| puts x if x !~ /^abc.*\d+$/ )}
abc 3 IN
=> "abc 1\nabc 20\nabc 3 IN\nabc 101"

答案是

代码: 全选

/^abc.*\d+$/

代码: 全选

sed -e 's/.*[0-9]$//'  filename
上次由 sevk 在 2009-04-13 11:58,总共编辑 1 次。
笔记本 :
F208S : gentoo
A460P i3G D6 : UBUNTU + WIN7
UN43D1 : UBUNTU + WIN7
1000人超级QQ群 LINUX + WIN : 31465544 或 18210387
头像
eexpress
帖子: 58428
注册时间: 2005-08-14 21:55
来自: 长沙

Re: 求教正则表达式高手

#11

帖子 eexpress » 2009-04-13 11:21

sevk, 说过.*不对的。还来。sed这里没支持非贪婪匹配的?的。
/^abc\ \d+$/
● 鸣学
头像
sevk
帖子: 2060
注册时间: 2007-05-08 16:26
系统: arch
来自: 火星内核某分子内某原子核内
联系:

Re: 求教正则表达式高手

#12

帖子 sevk » 2009-04-13 11:59

代码: 全选

sed -e 's/.*[0-9]$//'  b.txt 
笔记本 :
F208S : gentoo
A460P i3G D6 : UBUNTU + WIN7
UN43D1 : UBUNTU + WIN7
1000人超级QQ群 LINUX + WIN : 31465544 或 18210387
头像
keky
帖子: 231
注册时间: 2007-12-20 15:08
来自: harbin
联系:

Re: 求教正则表达式高手

#13

帖子 keky » 2009-04-13 20:42

grep '^abc .*[0-9]$' b.txt
Keep trying...never say never. blog: H。U。C

代码: 全选

        .--.
       |o_o |
       |:_/ |           < Hello Girl >
      //   \ \             ------------
     (|     | )
    /'\_   _/`\
    \___)=(___/
cmdblock
帖子: 307
注册时间: 2008-12-01 7:52
来自: 蜀山

Re: 求教正则表达式高手

#14

帖子 cmdblock » 2009-04-14 0:04

eexpress 写了:/^abc *[0-9]$/
空格转义。单数字结束也不对。[0-9]+。至少有一个数字
我还是不太明白,空格转义,转了什么义阿?转义不是要用 \ 这个符号吗?
我觉得它应该匹配abc 232v5,abc sdf9这样的字符串。
aerofox
帖子: 1453
注册时间: 2008-05-24 8:30

Re: 求教正则表达式高手

#15

帖子 aerofox » 2009-04-14 6:10

“/^abc *[0-9]$/” 匹配的是 “abc 5”、“abc 6” 等这样的字符串,匹配 “abc 232v5”、“abc sdf9” 这样的字符串应该用 “/^abc .*[0-9]$”
其实楼主的问题单靠一个样例文本不能很好的描述清楚,单从楼主的贴子来看,可以有很多种理解:
删除以abc开头以数字结尾的行
删除最后一个词是一个十进制整数的行
删除以数字结尾的行
删除只包含两个词的行
只保留以IN结尾的行
只保留包含三个词的行
只保留第三行
....
回复