Chinaunix
标题:
awk中正则表达中重复次数的限制
[打印本页]
作者:
hujysh
时间:
2015-09-14 10:41
标题:
awk中正则表达中重复次数的限制
QQ:/tmp>cat /tmp/xxx
C
DA
正则表达式,表示重复次数 用如下办法只能到255
用255可以
QQ:/tmp>awk '{if($0 ~ "^.{0,255}$") print "OK"; else print "BAD"}' /tmp/xxx
OK
OK
用256不可以
QQ:/tmp>awk '{if($0 ~ "^.{0,256}$") print "OK"; else print "BAD"}' /tmp/xxx
BAD
BAD
QQ:/tmp>
grep "^.\{0,256\}$" /tmp/xxx
会报错:
Invalid \{\} repetition.
用255则可以。
这个255的限制有没有办法突破呢???
作者:
MMMIX
时间:
2015-09-14 10:47
回复
1#
hujysh
干嘛非得用正则不可?你是要解决问题还是要测试awk正则的极限?
作者:
ly5066113
时间:
2015-09-14 10:50
回复
1#
hujysh
估计是版本问题:
$ awk --posix '{if($0 ~ "^.{1,2000}$") print "OK"; else print "BAD"}' file
OK
OK
复制代码
作者:
hujysh
时间:
2015-09-14 11:05
回复
3#
ly5066113
AIX的机器,没有 --posix 选项
作者:
ly5066113
时间:
2015-09-14 11:11
回复
4#
hujysh
版本不同而已,说你的原始需求吧,都是可以解决的。
作者:
hujysh
时间:
2015-09-14 11:11
回复
2#
MMMIX
要解决问题,问题简化后就是我帖子里面说的。
实际上,是一个检查文件合法性的脚本,检查规则由用户自己配置,他们想用这种类似的配置来检查长度(长度可变,有个范围),
用正则表达式的原因,他们可以定制不同行的不同规则,可以到具体内容的检查。
作者:
hujysh
时间:
2015-09-14 11:14
6楼有应用的简单说明。
谢谢!
回复
6#
ly5066113
作者:
jason680
时间:
2015-09-14 11:15
回复
4#
hujysh
$ grep
-P
"^.{0,
300
}$" /tmp/xxx
C
DA
$ perl -lane "{print if(/^.{0,
300
}$/)}" /tmp/xxx
C
DA
Note: It's
NOT
a good idea for your problem
作者:
ly5066113
时间:
2015-09-14 11:17
回复
7#
hujysh
长度可以用 length
$ awk '{if(length>=0&&length<=256) print "OK"; else print "BAD"}' file
OK
OK
复制代码
作者:
hujysh
时间:
2015-09-14 11:29
回复
9#
ly5066113
是的。谢谢!
这样做要放弃正则了。
作者:
hujysh
时间:
2015-09-14 11:33
回复
8#
jason680
好吧。方法很多。
我的机器上没有perl , grep不支持-P
我只能绕道了。
作者:
ly5066113
时间:
2015-09-14 11:47
回复
10#
hujysh
1、没有必要放弃正则,2者是不冲突的,可以同时使用。
2、AIX 默认都是安装了 perl 的,执行 perl -v 试试
作者:
jason680
时间:
2015-09-14 13:08
@ly5066113
@hujysh
又是X-Y problem
http://bbs.chinaunix.net/thread-4118053-1-1.html
作者:
hujysh
时间:
2015-09-14 15:12
回复
13#
jason680
我不觉得是x-y
我提的问题是针对现有解决方案的,但是碰到问题了,看大家有没有办法。
结果是,限于版本,限于程序既定框架,这条路没有办法。
谢谢大家的思路!
最后的方案是:
保留使用正则表达式对具体内容进行检查;
使用awk里length函数对长度进行检查。
这样程序修改比较小。
欢迎光临 Chinaunix (http://bbs.chinaunix.net/)
Powered by Discuz! X3.2