分页: 1 / 2

求教正则表达式高手

发表于 : 2009-04-13 5:57
cmdblock
我有一个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结束的字符串

Re: 求教正则表达式高手

发表于 : 2009-04-13 6:09
aerofox

代码: 全选

sed '/^abc \+[[:digit:]]\+$/d' b.txt

Re: 求教正则表达式高手

发表于 : 2009-04-13 8:21
a0147520
sed -e '/^abc.*[^0-9]$/d' b.txt

Re: 求教正则表达式高手

发表于 : 2009-04-13 9:45
eexpress
/^abc *[0-9]$/
空格转义。单数字结束也不对。[0-9]+。至少有一个数字

Re: 求教正则表达式高手

发表于 : 2009-04-13 10:20
qq274980
sed '/^abc.*[0-9]$/d'

Re: 求教正则表达式高手

发表于 : 2009-04-13 10:22
qq274980
sed -n '/^abc.*[^0-9]$/p'

Re: 求教正则表达式高手

发表于 : 2009-04-13 10:23
qq274980
grep ^abc | grep -v [0-9]$

Re: 求教正则表达式高手

发表于 : 2009-04-13 10:23
qq274980
grep ^"abc.*[^0-9]$"

Re: 求教正则表达式高手

发表于 : 2009-04-13 10:24
eexpress
qq274980 写了:sed '/^abc.*[0-9]$/d'
匹配abcnnnnd0
:em05

Re: 求教正则表达式高手

发表于 : 2009-04-13 10:49
sevk

代码: 全选

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

Re: 求教正则表达式高手

发表于 : 2009-04-13 11:21
eexpress
sevk, 说过.*不对的。还来。sed这里没支持非贪婪匹配的?的。
/^abc\ \d+$/

Re: 求教正则表达式高手

发表于 : 2009-04-13 11:59
sevk

代码: 全选

sed -e 's/.*[0-9]$//'  b.txt 

Re: 求教正则表达式高手

发表于 : 2009-04-13 20:42
keky
grep '^abc .*[0-9]$' b.txt

Re: 求教正则表达式高手

发表于 : 2009-04-14 0:04
cmdblock
eexpress 写了:/^abc *[0-9]$/
空格转义。单数字结束也不对。[0-9]+。至少有一个数字
我还是不太明白,空格转义,转了什么义阿?转义不是要用 \ 这个符号吗?
我觉得它应该匹配abc 232v5,abc sdf9这样的字符串。

Re: 求教正则表达式高手

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