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

时间:2018-11-29 17:39:46

标签: regex perl

我正在为此寻求快速解决方案,因为我并不真正擅长于perl / regex。

我有一个字符串如下;

  

abc_def0_ghi4_jkl_mno_pqr_123456.log some_extra_messages和随机垃圾

,我想要一个小的perl脚本(不是单行命令),该脚本将搜索.log文件名,并删除文件末尾的数字。这样输出看起来就像

  

abc_def0_ghi4_jkl_mno_pqr

有什么建议吗?

2 个答案:

答案 0 :(得分:1)

基于您提供的一些信息的快速答案(可能是肮脏的)

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»»。

答案 1 :(得分:0)

看起来 就像您要输出的所有内容,直到(但不包括)日志文件名之前的下划线。那是对的吗?您需要非常具体地说明数据的结构;否则,我们不得不猜测。

这是一个简短的脚本,可以接收示例输入并生成示例输出:

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
  • 在行尾再加上其他任何字符

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