解析并重新排列主机名

Kan*_*han 8 c++ python perl awk

下面是存储在文本文件中的主机名列表.

web1.maxi.com
web3.maxi.com
web4.maxi.com
web5.maxi.com
web6.maxi.com
web7.maxi.com
web8.maxi.com
web9.maxi.com
web11.maxi.com
Run Code Online (Sandbox Code Playgroud)

为了显示它,它需要被解析和重写/显示为

web[1,3-9,11].maxi.com
Run Code Online (Sandbox Code Playgroud)

你能帮助我吗,任何建议都会有所帮助.

Tho*_*hor 3

通过 perl,您可以使用该Set::IntSpan模块来压缩数字序列。

以下解决方案可以处理混合和无序的网站列表。

内菲莱

web3.maxi.com
web4.maxi.com
web5.maxi.com
mail1.mexi.com
web6.maxi.com
web9.maxi.com
web9.maxi.com

web11.maxi.com
mail3.mexi.com
web7.maxi.com
mail4.mexi.com
mail25.mexi.com      
  mail26.mexi.com
mail27.mexi.com
mail28.mexi.com
  web8.maxi.com
mail29.mexi.com
mail110.mexi.com
web1.maxi.com
Run Code Online (Sandbox Code Playgroud)

解析程序

#!/usr/bin/perl -l

use Set::IntSpan;
use File::Slurp qw/slurp/;

$str = slurp(\*STDIN);

# Remove redundant whitespace
chop $str;
$str =~ s/^[\t ]+|[\t ]+$//gm;
$str =~ s/\R+/\n/g;

# Copy $str so we can match numbers in it without disturbing the loop
$nums = $str;

# Parse lines in $str in sequence
while($str =~ /^(.*)$/gm) {
  $line = $1;

  # Extract bits before and after number
  ($pre, $post) = $line =~ /([^\d]+)\d+(.*)$/m;

  # Check if its been printed already
  next if $seen{$pre . $post};

  # If not, extract numbers
  @numbers = $nums =~ /$pre(\d+)$post/g;

  print $pre . "[" 
        . Set::IntSpan->new(@numbers)->run_list()
        . "]" . $post;

  $seen{$pre . $post} = 1;
}
Run Code Online (Sandbox Code Playgroud)

像这样运行它:

perl parse.pl < infile
Run Code Online (Sandbox Code Playgroud)

输出:

web[1,3-9,11].maxi.com
mail[1,3-4,25-29,110].mexi.com
Run Code Online (Sandbox Code Playgroud)

也许有些神秘,它@numbers = $nums =~ /$pre(\d+)$post/g扩展为与正则表达式匹配的项目数组,并将其保存在@numbers.

请注意,此解决方案将整个文件加载到内存中。