分页: 1 / 1

有熟 awk 的吗, substr的问题

发表于 : 2011-07-20 9:41
fanhe
需要一个从源文件中提取 #include 的字符串, 自己折腾了个

代码: 全选

mawk '/^[ \t]*#[ \\t]*include[ \t]*(<[^>]+>|"[^"]+")/ {sub(/^[ \t]*#[ \t]*include[ \t]*/, "");if(match($0, /(<[^>]+>|"[^"]+")/)) print substr($0, RESTART, RLENGTH)}' /usr/include/stdio.h
居然输出
<features.h
<stddef.h
<bits/types.h
<libio.h
<stdarg.h
<bits/stdio_lim.h
<bits/sys_errlist.h
<getopt.h
<bits/stdio.h
<bits/stdio2.h
<bits/stdio-ldbl.h
到底什么问题啊, 换 gawk 的话就会正常
不考虑 gawk, mawk 比 gawk 快太多了
mawk 有这么严重的bug?

能否用 sed 实现, 能的话能否给个例子

Re: 有熟 awk 的吗, substr的问题

发表于 : 2011-07-20 9:57
eexpress
awk的高手啊。
只是别太固执,多学一门脚本吧。

Re: 有熟 awk 的吗, substr的问题

发表于 : 2011-07-20 11:15
fanhe
eexpress 写了:awk的高手啊。
只是别太固执,多学一门脚本吧。

我本来是用python实现的, 测了一下速度, 比 awk 慢一倍左右
gawk 比 python 的还要慢啊...

而事实上, 在解析器里面跑, python 的还是要比调用外部程序要快

现在这个用不着了, 我对 awk 也失望了
乱七八糟的正则, 搞到人斯巴达

Re: 有熟 awk 的吗, substr的问题

发表于 : 2011-07-20 13:10
jarlyyn
sed -r -n "/#include(<.*>)/ {s/#include(<.*>)/\1/;p}" xxxxxxxxxxx

Re: 有熟 awk 的吗, substr的问题

发表于 : 2011-07-20 13:11
jarlyyn
fanhe 写了:
eexpress 写了:awk的高手啊。
只是别太固执,多学一门脚本吧。

我本来是用python实现的, 测了一下速度, 比 awk 慢一倍左右
gawk 比 python 的还要慢啊...

而事实上, 在解析器里面跑, python 的还是要比调用外部程序要快

现在这个用不着了, 我对 awk 也失望了
乱七八糟的正则, 搞到人斯巴达
正则其实还是不难的,恩恩

当年写mud机器人搞过几年正则的飘过

Re: 有熟 awk 的吗, substr的问题

发表于 : 2011-07-20 13:56
eexpress
说明下具体的,实际数据。
我来perl写一句?
awk的substr,很久没写过了,找抛弃了。

Re: 有熟 awk 的吗, substr的问题

发表于 : 2011-07-20 14:07
fanhe
jarlyyn 写了:
fanhe 写了:
eexpress 写了:awk的高手啊。
只是别太固执,多学一门脚本吧。

我本来是用python实现的, 测了一下速度, 比 awk 慢一倍左右
gawk 比 python 的还要慢啊...

而事实上, 在解析器里面跑, python 的还是要比调用外部程序要快

现在这个用不着了, 我对 awk 也失望了
乱七八糟的正则, 搞到人斯巴达
正则其实还是不难的,恩恩

当年写mud机器人搞过几年正则的飘过
正则规则我当然熟, vim 的正则我熟练, 都用正则重写了 vim 的 omnicpp了
关键是, vim, python, awk, grep, sed 的正则各种不一样, 某些特性支持,某些特性不支持, 某些加反斜杠, 某些不加
我操!

放弃 awk 了, 以后直接上 python

Re: 有熟 awk 的吗, substr的问题

发表于 : 2011-07-20 14:08
fanhe
eexpress 写了:说明下具体的,实际数据。
我来perl写一句?
awk的substr,很久没写过了,找抛弃了。
不需要了

基于 python 的我早就写好了, 只是以为用外部程序会更快而已

浪费了时间

Re: 有熟 awk 的吗, substr的问题

发表于 : 2011-07-20 22:54
fnan
sed -n "s/\s*#\s*include\s*\([\"<].*[\">]\)\s*/\1/p" /usr/include/stdio.h
<features.h>
<stddef.h>
<bits/types.h>
<libio.h>
<stdarg.h>
<bits/stdio_lim.h>
<bits/sys_errlist.h>
<getopt.h>
<bits/stdio.h>
<bits/stdio2.h>
<bits/stdio-ldbl.h>

Re: 有熟 awk 的吗, substr的问题

发表于 : 2011-07-20 22:56
fnan
awk '/^[ \t]*#[ \\t]*include[ \t]*(<[^>]+>|"[^"]+")/ {sub(/^[ \t]*#[ \t]*include[ \t]*/, "");if(match($0, /(<[^>]+>|"[^"]+")/)) print substr($0, RESTART, RLENGTH)}' /usr/include/stdio.h
<features.h>
<stddef.h>
<bits/types.h>
<libio.h>
<stdarg.h>
<bits/stdio_lim.h>
<bits/sys_errlist.h>
<getopt.h>
<bits/stdio.h>
<bits/stdio2.h>
<bits/stdio-ldbl.h>
没什么问题啊?