有熟 awk 的吗, substr的问题

sh/bash/dash/ksh/zsh等Shell脚本
回复
头像
fanhe
帖子: 2357
注册时间: 2007-03-24 23:45

有熟 awk 的吗, substr的问题

#1

帖子 fanhe » 2011-07-20 9:41

需要一个从源文件中提取 #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 实现, 能的话能否给个例子
头像
eexpress
帖子: 58428
注册时间: 2005-08-14 21:55
来自: 长沙

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

#2

帖子 eexpress » 2011-07-20 9:57

awk的高手啊。
只是别太固执,多学一门脚本吧。
● 鸣学
头像
fanhe
帖子: 2357
注册时间: 2007-03-24 23:45

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

#3

帖子 fanhe » 2011-07-20 11:15

eexpress 写了:awk的高手啊。
只是别太固执,多学一门脚本吧。

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

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

现在这个用不着了, 我对 awk 也失望了
乱七八糟的正则, 搞到人斯巴达
头像
jarlyyn
帖子: 4671
注册时间: 2006-04-12 18:54
联系:

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

#4

帖子 jarlyyn » 2011-07-20 13:10

sed -r -n "/#include(<.*>)/ {s/#include(<.*>)/\1/;p}" xxxxxxxxxxx
头像
jarlyyn
帖子: 4671
注册时间: 2006-04-12 18:54
联系:

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

#5

帖子 jarlyyn » 2011-07-20 13:11

fanhe 写了:
eexpress 写了:awk的高手啊。
只是别太固执,多学一门脚本吧。

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

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

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

当年写mud机器人搞过几年正则的飘过
头像
eexpress
帖子: 58428
注册时间: 2005-08-14 21:55
来自: 长沙

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

#6

帖子 eexpress » 2011-07-20 13:56

说明下具体的,实际数据。
我来perl写一句?
awk的substr,很久没写过了,找抛弃了。
● 鸣学
头像
fanhe
帖子: 2357
注册时间: 2007-03-24 23:45

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

#7

帖子 fanhe » 2011-07-20 14:07

jarlyyn 写了:
fanhe 写了:
eexpress 写了:awk的高手啊。
只是别太固执,多学一门脚本吧。

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

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

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

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

放弃 awk 了, 以后直接上 python
头像
fanhe
帖子: 2357
注册时间: 2007-03-24 23:45

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

#8

帖子 fanhe » 2011-07-20 14:08

eexpress 写了:说明下具体的,实际数据。
我来perl写一句?
awk的substr,很久没写过了,找抛弃了。
不需要了

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

浪费了时间
fnan
帖子: 919
注册时间: 2009-07-01 22:04

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

#9

帖子 fnan » 2011-07-20 22:54

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>
bash不如perl精妙,学不到lisp的皮毛,远不够c++强悍,不过可以用。
fnan
帖子: 919
注册时间: 2009-07-01 22:04

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

#10

帖子 fnan » 2011-07-20 22:56

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>
没什么问题啊?
bash不如perl精妙,学不到lisp的皮毛,远不够c++强悍,不过可以用。
回复