代码之家  ›  专栏  ›  技术社区  ›  vedant gala

使用perl打印整个字符串,直到出现子字符串匹配

  •  -2
  • vedant gala  · 技术社区  · 6 年前

    我正在寻找一个快速的解决方案,因为我并不真正专门研究perl/regex。

    我有一根绳子,如下所示;

    abc_def0_ghi4_jkl_mno_pqr_123456.记录一些额外的_消息和随机垃圾

    我需要一个小的Perl脚本(不是一个命令行)来搜索.log文件名,并删除文件末尾的数字。所以输出看起来像

    abc_def0_ghi4_jkl_mno_pqr公司

    有什么建议吗?

    2 回复  |  直到 6 年前
        1
  •  1
  •   GMB    6 年前

    根据你提供的一些信息,快速(可能是肮脏的)回答

    use strict;
    use warnings;
    
    my $str = "abc_def0_ghi4_jkl_mno_pqr_123456.log some_extra_messages and random garbage";
    
    my ($name) = ( $str =~ /^(\w+)_\d+\.log/);
    print $name, "\n";
    

    这假设名称位于脚本的开头,并且只包含单词字符(字母、数字、下划线)。它将捕获所有内容,直到它到达一个数字序列,该序列前面是下划线,后面是.log。

        2
  •  0
  •   showaltb    6 年前

    就像你想输出的所有东西,直到,但不包括,日志文件名前的下划线。对吗?您需要非常具体地说明数据的结构;否则,我们只能猜测。

    下面是一个简短的脚本,它接受示例输入并生成示例输出:

    use strict;
    use warnings;
    
    my $str = 'abc_def0_ghi4_jkl_mno_pqr_123456.log some_extra_messages and random garbage';
    
    s/_[^_]+\.log.*// for $str;
    
    print $str, "\n";
    

    这个 s/_[^_]+\.log.*// 替换匹配:

    • 下划线
    • 后跟一个或多个非下划线
    • 后面跟着字符 .log
    • 后跟任何其他字符到行尾

    匹配的文本将替换为空字符串(已删除),并打印其余文本。