免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 6392 | 回复: 10
打印 上一主题 下一主题

如何定位匹配字符串在文本中的位置 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2012-03-28 23:16 |只看该作者 |倒序浏览
30可用积分
pos 函数可以定位每次匹配的位置,(第几个字符),如果想得到是第几行,也就是 grep 的效果。怎么办?

论坛徽章:
7
戌狗
日期:2013-12-15 20:43:38技术图书徽章
日期:2014-03-05 01:33:12技术图书徽章
日期:2014-03-15 20:31:17未羊
日期:2014-03-25 23:48:20丑牛
日期:2014-04-07 22:37:44巳蛇
日期:2014-04-11 21:58:0915-16赛季CBA联赛之青岛
日期:2016-03-17 20:36:13
2 [报告]
发表于 2012-03-28 23:16 |只看该作者
本帖最后由 rubyish 于 2012-03-29 05:09 编辑

论坛徽章:
7
戌狗
日期:2013-12-15 20:43:38技术图书徽章
日期:2014-03-05 01:33:12技术图书徽章
日期:2014-03-15 20:31:17未羊
日期:2014-03-25 23:48:20丑牛
日期:2014-04-07 22:37:44巳蛇
日期:2014-04-11 21:58:0915-16赛季CBA联赛之青岛
日期:2016-03-17 20:36:13
3 [报告]
发表于 2012-03-29 06:56 |只看该作者
本帖最后由 rubyish 于 2012-03-29 05:09 编辑

#!/usr/bin/perl -w
# 2012-03-29

use 5.014;
use strict;
sub line(\$);
my $file = do { local $/; <DATA> };

say line $file while $file =~ /ok/g;

sub line(\$) {
    my ( $file, $begin, $index, $line ) = ( shift, 0, 0 );
    my $pos = pos $$file;
    while ($pos) {
        $index = index( $$file, "\n", $begin );
        $begin = $index + 1;
        ++$line;
        last if $index >= $pos;
    }
    return $line;
}

__DATA__
apple abble ok d
bablle bella ba
cello cilla ok ok ok
denmark damn
ok e
ok  ok

论坛徽章:
145
技术图书徽章
日期:2013-10-01 15:32:13戌狗
日期:2013-10-25 13:31:35金牛座
日期:2013-11-04 16:22:07子鼠
日期:2013-11-18 18:48:57白羊座
日期:2013-11-29 10:09:11狮子座
日期:2013-12-12 09:57:42白羊座
日期:2013-12-24 16:24:46辰龙
日期:2014-01-08 15:26:12技术图书徽章
日期:2014-01-17 13:24:40巳蛇
日期:2014-02-18 14:32:59未羊
日期:2014-02-20 14:12:13白羊座
日期:2014-02-26 12:06:59
4 [报告]
发表于 2012-03-29 09:37 |只看该作者
本帖最后由 jason680 于 2012-03-29 09:47 编辑

1: $.
2: while(<FH>){$sCount++;...}

$ cat grep.pl
use strict;
use warnings;

my $sKey = shift;
while(<>){
  if(m/$sKey/){
    print "$ARGV($.):$_";
  }
}

$ perl grep.pl Key grep.pl
grep.pl(5):my $sKey = shift;
grep.pl(7):  if(m/$sKey/){

$ grep -Hn Key grep.pl
grep.pl:5:my $sKey = shift;
grep.pl:7:  if(m/$sKey/){

论坛徽章:
0
5 [报告]
发表于 2012-03-29 10:00 |只看该作者
盗用3L数据{:3_193:}
  1. #!/usr/bin/perl
  2. use strict;
  3. use warnings;

  4. my $file = do{local $/;<DATA>};
  5. print line($file,pos($file)),"\n" while $file =~ /ok/g;

  6. sub line {
  7.         my ($file,$posi) = @_;
  8.         my $line = ($posi >= 1) ? 1 : undef;
  9.         while ($file =~ /\n/g) {
  10.                 if ($posi <= pos($file)) {
  11.                         last;
  12.                 } else {
  13.                         $line++;
  14.                 }
  15.         }
  16.         return $line;
  17. }

  18. __DATA__
  19. apple abble ok d
  20. bablle bella ba
  21. cello cilla ok ok ok
  22. denmark damn
  23. ok e
  24. ok  ok
复制代码

论坛徽章:
0
6 [报告]
发表于 2012-03-29 11:06 |只看该作者
本帖最后由 sjdy521 于 2012-03-29 11:22 编辑

可不可以换个角度
逐行匹配文本,如果匹配成功,就把行号也打印出来
  1. while(<FILE>){
  2. print "$.\t [        DISCUZ_CODE_0        ]" if /something/;
  3. }
复制代码
擦,发现个bug
$&被换成了
  1. [        DISCUZ_CODE_0        ]
复制代码


多谢 jason680 修订后:
  1. while(<FILE>){
  2. print "$.\t $&" if /something/;
  3. }
复制代码

论坛徽章:
145
技术图书徽章
日期:2013-10-01 15:32:13戌狗
日期:2013-10-25 13:31:35金牛座
日期:2013-11-04 16:22:07子鼠
日期:2013-11-18 18:48:57白羊座
日期:2013-11-29 10:09:11狮子座
日期:2013-12-12 09:57:42白羊座
日期:2013-12-24 16:24:46辰龙
日期:2014-01-08 15:26:12技术图书徽章
日期:2014-01-17 13:24:40巳蛇
日期:2014-02-18 14:32:59未羊
日期:2014-02-20 14:12:13白羊座
日期:2014-02-26 12:06:59
7 [报告]
发表于 2012-03-29 11:14 |只看该作者
本帖最后由 jason680 于 2012-03-29 11:20 编辑

回复 6# sjdy521

use $& and mark the "禁用表情" for special sign (like as smile)
mark the "禁用链接识别" for code
  1. xxx $& xxxx
复制代码

论坛徽章:
0
8 [报告]
发表于 2012-03-29 11:22 |只看该作者
回复 7# jason680


    搞定,多谢

论坛徽章:
0
9 [报告]
发表于 2012-03-29 12:44 |只看该作者
感谢大家的热心回复。从算法上来说 sjdy521 更简洁。但逐行匹配终究不如全文匹配效率高。
kk881623 的算法是和rubyish 差不多,但函数内部和外部的条件两次调用 s/ok/g, 似有不妥。
joson680 的是在处理文件句柄时的算法,对于一个文本字符串,是没有 $. 变量跟踪的。拆分成行在逐行匹配,也无法进行跨行的全文匹配。

最严谨,效率最高的算法,我认为是rubyish. 虽然代码看起来复杂一点。

想想看来,grep 这个工具蛮不错的。这个需求,我已经取消了,没有多大价值,而且牺牲较多效率。

论坛徽章:
145
技术图书徽章
日期:2013-10-01 15:32:13戌狗
日期:2013-10-25 13:31:35金牛座
日期:2013-11-04 16:22:07子鼠
日期:2013-11-18 18:48:57白羊座
日期:2013-11-29 10:09:11狮子座
日期:2013-12-12 09:57:42白羊座
日期:2013-12-24 16:24:46辰龙
日期:2014-01-08 15:26:12技术图书徽章
日期:2014-01-17 13:24:40巳蛇
日期:2014-02-18 14:32:59未羊
日期:2014-02-20 14:12:13白羊座
日期:2014-02-26 12:06:59
10 [报告]
发表于 2012-03-29 12:54 |只看该作者
回复 9# Perlvim

>>逐行匹配,也无法进行跨行的全文匹配。

在我看来,逐行读取与匹配,不一定不能做到跨行匹配....
端看须求与目的..
   
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP