Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby 如何将字符串汇总到shell glob中_Ruby_Text - Fatal编程技术网

Ruby 如何将字符串汇总到shell glob中

Ruby 如何将字符串汇总到shell glob中,ruby,text,Ruby,Text,是否有任何Ruby习惯用法或流行的库用于将字符串整合到shell glob中以生成它们?例如,给定字符串 abc1 abc2 abc3 我想生成字符串abc{1..3}或abc{1,2,3}。这很像在IP寻址中总结子网 我想Rubyesque方法可能涉及到对字符串进行排序,然后构建一个组成字符的数组,将不重叠的字符递归地放入嵌套数组中。但是,如果已经有了某种东西,我宁愿不要重新发明轮子。我借用了公认的解决方案,并使用了递归算法: def longest_common_substr(string

是否有任何Ruby习惯用法或流行的库用于将字符串整合到shell glob中以生成它们?例如,给定字符串

abc1
abc2
abc3
我想生成字符串
abc{1..3}
abc{1,2,3}
。这很像在IP寻址中总结子网


我想Rubyesque方法可能涉及到对字符串进行排序,然后构建一个组成字符的数组,将不重叠的字符递归地放入嵌套数组中。但是,如果已经有了某种东西,我宁愿不要重新发明轮子。

我借用了公认的解决方案,并使用了递归算法:

def longest_common_substr(strings)
  shortest = strings.min_by &:length
  maxlen = shortest.length
  maxlen.downto(0) do |len|
    0.upto(maxlen - len) do |start|
      substr = shortest[start,len]
      return substr if strings.all?{|str| str.include? substr }
    end
  end
end

def create_glob(files)
  return '' if files.compact.empty?

  stub=longest_common_substr(files)
  if stub.length == 0
    expansion = files.uniq.join(',')
    return '' if expansion == '' 
    return '{' + expansion + '}'
  end

  pre =  []
  post = []

  files.each do |file|
    i = file.index(stub)

    pre  << file[0, i] 
    post << file[i+stub.length..-1]
  end
  return create_glob(pre) + stub + create_glob(post)
end
它还涵盖了更复杂的情况,如可变前缀:

puts create_glob(['first.abc1',
                  'second.abc2',
                  'third.abc3'
                 ])
#=> {first,second,third}.abc{1,2,3}
甚至缺少值:

puts create_glob(['.abc1',
                  'abc',
                  'abc3'
                 ])
#=> {.,}abc{1,,3}
请注意,可能会生成非文件的字符串。例如,最后一个示例如下展开:

$ echo {.,}abc{1,,3}
.abc1 .abc .abc3 abc1 abc abc3

因此,使用输出时必须稍微小心一点。

这听起来像是X/Y问题。你想用这种方法解决的实际问题是什么?我问的X/Y问题是什么很抱歉让你失望,但这里没有诡计——这确实是我想做的!我正在编写一些ERB模板来标准化问题措辞,并希望总结相关项目组(如集群成员),以便于人类阅读。我并不是想用管子吹到炮弹或类似的东西上。这个措辞是针对技术受众的,在第一个
角色
集群中,
role01{a..c}
将是我们引用服务器a到c的最友好的方式。您好,看起来您需要找到最长的公共子字符串,然后合并剩余的块
$ echo {.,}abc{1,,3}
.abc1 .abc .abc3 abc1 abc abc3