. : : ClassiClub ForuM : : .

会员中心 论坛帮助 日历事件 标记论坛已读
返回   精品技术论坛 » 技术论坛 » 『软件使用』

『软件使用』: 电脑软件推荐, 电脑软件使用, 经验分享



发表新主题 关闭主题
 
主题工具
link
 
link 的头像
高级会员
 
资 料:
注册日期: Jun 2000
帖子: 724 声望值: 3
精华: 0,解答: 3
#46 旧 2008-09-07, 01:16:51 默认
link 当前离线  

不用抱歉,很高兴你这么耐心回答我的问题,所以很想把这个小工具用好。

我因为实际应用环境无法预知一个文件的格式,是ASCII和UNICODE之一,不会有其它,才有这种想法。我建议加一个uniscan之类的参数,假设源文件是unicode编码,进行自动识别,如果判断结果为否,则按ASCII处理,不用管GBK之类,因为涉及服务、配置、环境参数之类的文件,基本是两者之一,不会跑到GBK上面去。现在我是找到一个unicode文件,就手工写一条带参数的语句,感觉挺别扭的……

09-07版本:-ric在批处理中无法退出(不执行下一步),-rnnlic不能正确处理\r\n,现在也无法退出,我明天再测试。

此帖于 2008-09-07 01:48:01 被 link 编辑. .
ASBai
 
ASBai 的头像
热心会员
 
资 料:
注册日期: May 2005
帖子: 4,721 声望值: 5
精华: 18,解答: 26
#47 旧 2008-09-07, 11:57:16 默认
ASBai 当前离线  

引用:
作者: link 查看帖子
09-07版本:-ric在批处理中无法退出(不执行下一步),-rnnlic不能正确处理\r\n,现在也无法退出,我明天再测试。
没看明白,我这里 -r, -ric, -rnnl, -rnnlic 都测试过了,没问题。rnnl 开头的会跨行匹配,前两者的匹配不会跨行,现在可以直接用 -r 或者 -ric,不用 .*k2.*,不用 \r\n 了


baiy.cn
俺的原创免费作品站
link
 
link 的头像
高级会员
 
资 料:
注册日期: Jun 2000
帖子: 724 声望值: 3
精华: 0,解答: 3
#48 旧 2008-09-07, 13:59:37 默认
link 当前离线  


运行m:f test.txt -ric:^[^\.]* -stdout——
持续输出
test.txt:1:aaa.bbb
test.txt:1:aaa.bbb
test.txt:1:aaa.bbb
……
需要强行中止

运行m:f test.txt -ric:^[^\.]*\r\n -stdout——
test.txt:2:ccc
test.txt:3:ddd.eee
test.txt:4:

bwfr测试过程——
建立test.txt内容: aaa.bbb
ccc
ddd.eee

建立test.ptn内容:^[^\.]*

0906版bwfr:m:bwfr test.txt -ric -argfile:test.ptn -stdout无输出,需要CTRL-C
0906版bwfr:m:bwfr test.txt -rnnlic -argfile:test.ptn -stdout无输出,需要CTRL-C
0907版bwfr:m:bwfr test.txt -ric -argfile:test.ptn -stdout无输出,需要CTRL-C
0907版bwfr:m:bwfr test.txt -rnnlic -argfile:test.ptn -stdout无输出,需要CTRL-C

修改test.ptn内容:^[^\.]*\r\n

0906版bwfr:m:bwfr test.txt -ric -argfile:test.ptn -stdout无过滤输出3行
0906版bwfr:m:bwfr test.txt -rnnlic -argfile:test.ptn -stdout有过滤输出1、3行
0907版bwfr:m:bwfr test.txt -ric -argfile:test.ptn -stdout有过滤输出1、3行
0907版bwfr:m:bwfr test.txt -rnnlic -argfile:test.ptn -stdout无过滤输出3行

结论——不跨行的搜索可能失效?
link
 
link 的头像
高级会员
 
资 料:
注册日期: Jun 2000
帖子: 724 声望值: 3
精华: 0,解答: 3
#49 旧 2008-09-07, 14:02:48 默认
link 当前离线  


补充:m:f test.txt -ric:^c -stdout
输出
test.txt:2:ccc
test.txt:2:ccc
test.txt:2:ccc
一共3行,应该是是1行才对吧?
ASBai
 
ASBai 的头像
热心会员
 
资 料:
注册日期: May 2005
帖子: 4,721 声望值: 5
精华: 18,解答: 26
#50 旧 2008-09-08, 14:09:29 默认
ASBai 当前离线  

引用:
作者: link 查看帖子
运行m:f test.txt -ric:^[^\.]* -stdout——
持续输出
test.txt:1:aaa.bbb
test.txt:1:aaa.bbb
test.txt:1:aaa.bbb
……
需要强行中止

运行m:f test.txt -ric:^[^\.]*\r\n -stdout——
test.tx......
引用:
作者: link 查看帖子
补充:m:f test.txt -ric:^c -stdout
输出
test.txt:2:ccc
test.txt:2:ccc
test.txt:2:ccc
一共3行,应该是是1行才对吧?
第一个问题,无论是 f 还是 bwfr 行为不正确都是因为程序没能正确处理零长匹配,和没能在后续搜索时重设锚点位。

举例来说,f 第一次匹配 aaa.bbb 时,“^[^.]*”匹配到了 "aaa",第二次从 "aaa" 之后,"." 之前的位置开始匹配,由于没有重设行首锚点,正则表达式匹配了 "aaa" 和 "." 之间的空串,由于空串的长度是 0,所以试图继续下一次匹配时总是在原地循环匹配那个空串,导致程序出错。

BTW:正则表达式“^[^.]*”因为整个表达式使用了 '*' 限定,所以本身匹配空串是没问题的,vi、sed 等工具也都会匹配到这个空串。

"^c" 三次匹配 "ccc" 的问题也是行首锚点位重设问题。

以上两个 bug 已修正,等我再测试测试没问题就上传。link 兄辛苦了。这次为了新增高级正则(ARE)支持,所以改了一些几年没怎么动过的底层库里的代码,结果折腾出这么多问题。。。。。。人世间最悲剧的事莫过于此~~

为了感谢 link 兄等 XDJM 的大力支持,准备在这次 bug 都解决以后把 linux / freebsd 版也发出来给大家乐乐
link
 
link 的头像
高级会员
 
资 料:
注册日期: Jun 2000
帖子: 724 声望值: 3
精华: 0,解答: 3
#51 旧 2008-09-08, 21:24:00 默认
link 当前离线  


别客气,这套小工具对我完成工作必不可少,期待新版本早日放出来。
ASBai
 
ASBai 的头像
热心会员
 
资 料:
注册日期: May 2005
帖子: 4,721 声望值: 5
精华: 18,解答: 26
#52 旧 2008-09-08, 22:51:11 默认
ASBai 当前离线  

引用:
作者: link 查看帖子
别客气,这套小工具对我完成工作必不可少,期待新版本早日放出来。
更新了,请重新下载
link
 
link 的头像
高级会员
 
资 料:
注册日期: Jun 2000
帖子: 724 声望值: 3
精华: 0,解答: 3
#53 旧 2008-09-09, 10:22:26 默认
link 当前离线  

bwfr反馈1——
test.txt内容:
aaa.bbb
ccc
ddd.eee,1
ddd.eee,2
ddd.eee,3
ddd.eee,4
ddd.eee,5
server=fff.ggg
hhh.iii

test.ptn内容:
^ddd\.eee.*\r\n

bwfr命名行:
bwfr test.txt.new -ric -argfile:test.ptn -exp

输出:
aaa.bbb
ccc
ddd.eee,2
ddd.eee,4
server=fff.ggg
hhh.iii

结论:
-ric连续替换2行时,没有替换第2行?

BTW: 0907提到的匹配空串是否应该修改pattern排除掉?无论是否应该排除掉,请帮我修改出排除掉空串的pattern好吗,我不会怎么表达空串?

此帖于 2008-09-09 11:14:25 被 link 编辑. .
link
 
link 的头像
高级会员
 
资 料:
注册日期: Jun 2000
帖子: 724 声望值: 3
精华: 0,解答: 3
#54 旧 2008-09-09, 11:40:30 默认
link 当前离线  

bwfr反馈2——
test.txt内容:
[S1]
aaa.bbb
ccc
[S2]
server=fff.ggg\fff.ggg
[S3]
hhh.iii

test.ptn内容:
(\[S2\])([^\[]*)->\1\r\n

bwfr命名行:
bwfr test.txt.new -rnnlic -argfile:test.ptn -exp

输出:
[S1]
aaa.bbb
ccc
[S2]
\fff.ggg
[S3]
hhh.iii

结论:
-rnnlic替换时对源字符串进行了2次解释?
再测试发现是错误理解了转义字符?改成(\[S2\])([^[]*)->\1\r\n就通过了。
但在[]里面\不是应该用\\表达的么?另外如果需要包含]怎么办,这时候就要使用\了吧?

BTW: hxxp://www.unibetter.com/deerchao/zhengzhe-biaodashi-jiaocheng-se.htm
关于多行/单行模式的说法比较有意思,和跨行匹配是不同的?

此帖于 2008-09-09 12:34:30 被 link 编辑. .
ASBai
 
ASBai 的头像
热心会员
 
资 料:
注册日期: May 2005
帖子: 4,721 声望值: 5
精华: 18,解答: 26
#55 旧 2008-09-09, 12:12:20 默认
ASBai 当前离线  

引用:
作者: link 查看帖子
bwfr反馈1——
test.txt内容:
aaa.bbb
ccc
ddd.eee,1
ddd.eee,2
ddd.eee,3
ddd.eee,4
ddd.eee,5
server=fff.ggg
hhh.iii

test.ptn内容:
^ddd\.eee.*\r\n

bwfr命名行:
bwfr test.txt.......
行首锚点 "^" 的意义是匹配文件头部和文件中每个 "\r\n" 的后面第一个字符前的位置(即:每行的起始)。在此例中,只能隔行匹配是因为你的替换表达式尾部吃掉了回车换行(\r\n)继续下一次匹配时就没法再匹配行首了。建议用 "^ddd\.eee.*$"。

这个我不知道算不算是个程序缺陷,等我参考一下 vi、sed、grep 的行为~

PS: 如果不想零长匹配的话,用 "+" 代替 "*" 就好了,比如:"^[^.]+"

PS: 多行模式的花样比较多,有只影响锚点匹配的,也有只影响通配符匹配的,也有都影响的。参见我对 ARE 模式的说明。

此帖于 2008-09-09 12:18:08 被 ASBai 编辑. .
ASBai
 
ASBai 的头像
热心会员
 
资 料:
注册日期: May 2005
帖子: 4,721 声望值: 5
精华: 18,解答: 26
#56 旧 2008-09-09, 12:33:58 默认
ASBai 当前离线  

引用:
作者: link 查看帖子
bwfr反馈2——
test.txt内容:
[S1]
aaa.bbb
ccc
[S2]
server=fff.ggg\fff.ggg
[S3]
hhh.iii

test.ptn内容:
(\[S2\])([^\[]*)->\1\r\n

bwfr命名行:
bwfr test.txt.new -rnnlic -ar......
"(\[S2\])([^\[]*)" 这句写错了,'[' 在字符集匹配中不是特殊字符,不用换码,应该写成:"(\[S2\])([^[]*)"
link
 
link 的头像
高级会员
 
资 料:
注册日期: Jun 2000
帖子: 724 声望值: 3
精华: 0,解答: 3
#57 旧 2008-09-09, 12:41:46 默认
link 当前离线  

谢谢解答。
吃掉回车换行的原因是要删除这一行,发现使用$的效果是将\r\n变成\n,是不是考虑设计成使用$就删除一行(去掉\r\n)更符合DOS格式的习惯,如果使用$保留\r\n就麻烦了,我想不出怎样删除连续2行,请考虑……

(\[S2\])([^\[]*)这里我是想当然了,谢谢指出,我个人认为对于[]里单个\后面不是特殊字符的就抛弃可能兼容性更好,因为要使用\的时候都要用\\的。如果规则已经定义了\后面不是特殊字符则\作本义处理的话,请告诉我。

删除一行的功能对我的程序很重要,请尽量解决,拜托了!

此帖于 2008-09-09 16:48:51 被 link 编辑. .
ASBai
 
ASBai 的头像
热心会员
 
资 料:
注册日期: May 2005
帖子: 4,721 声望值: 5
精华: 18,解答: 26
#58 旧 2008-09-09, 17:56:08 默认
ASBai 当前离线  

引用:
作者: link 查看帖子
删除一行的功能对我的程序很重要,请尽量解决,拜托了!
好吧,update 了,下载吧
link
 
link 的头像
高级会员
 
资 料:
注册日期: Jun 2000
帖子: 724 声望值: 3
精华: 0,解答: 3
#59 旧 2008-09-09, 18:35:49 默认
link 当前离线  

引用:
作者: ASBai 查看帖子
好吧,update 了,下载吧
十分感谢! 我关于-ric的代码全部都顺利通过了!

bwfr -rnnlic怎样支持行首匹配^?
如果只支持文件头则实用性很低,能否设计成支持任意一行的行首?
否则在文件中想匹配行首要怎么写?

实际情形是一种配置文件,类ini
[s1]
...
[s2]
...
需要删除整个[s2](包括标签),或者是清空section的内容但保留标签[s2]
ASBai
 
ASBai 的头像
热心会员
 
资 料:
注册日期: May 2005
帖子: 4,721 声望值: 5
精华: 18,解答: 26
#60 旧 2008-09-09, 20:37:16 默认
ASBai 当前离线  

引用:
作者: link 查看帖子
十分感谢! 我关于-ric的代码全部都顺利通过了!

bwfr -rnnlic怎样支持行首匹配^?
如果只支持文件头则实用性很低,能否设计成支持任意一行的行首?
否则在文件中想匹配行首要怎么写?

实际情形是一种配置文件,类ini
[s1]
...
[s2]
...
需要删除整个[s2](包括标签),或者是清空sect......
就是 ^$ 匹配行首和行尾,但通配符能够跨行匹配?用 ARE 的 'w' 模式就对了。具体参见 ARE 的文档。
发表新主题 关闭主题

主题工具

论坛规则  发帖规则
不可以发表主题
不可以回复帖子
不可以上传附件
不可以编辑自己的帖子
论坛启用 vB 代码
版面启用 表情符号
版面启用 [IMG] 代码
版面禁用 HTML 代码


所有时间均为北京时间, 现在的时间是 23:52:37.

本论坛带宽由迅通网络提供
SSL证书由TrustAsia提供

Copyright © 2000 - 2019 ClassiClub Forum All Rights Reserved.
粤ICP备09123456号