长时间不用经常忘记, 还是总结下常用的, 每次总结自己用到的小例子
文件名排序
描述: 文件名包含两段 num1_num2.jpg, 在文件浏览器看到的顺序和find 命令得到的文件顺序不一致, 因此希望通过脚本修改.
这里主要展示 hash 排序
lines = File.open(forg_list).readlines
mp={}
lines.each do |line|
line =~ /^(\d+)_(\d+)/
#puts $1, $2
mp[$1] = {} unless mp.has_key? $1
v2=$2
#puts v2, "%02d"%v2
#exit
mp[$1]["%02d"%v2]=v2
end
File.open(flist, "w") do |fp|
mp.each do |k1, v1|
v1 = v1.sort { |k, v| k.first <=> v.first }.to_h
v1.each do |k2, v2|
fp.puts "#{k1}_#{v2}.jpg"
end
end
end
方法二:
https://stackoverflow.com/questions/51341134/how-to-sort-file-names-in-ruby
pics = pics.sort_by do |name|
name =~ /\/(\d+)\.jpg/
$1.to_i
# 其实可以返回一个数组, 只要第一个是inter就行
end
正则
下面演示了如何生成部分正则字符串然后使用。 该功能就是选取标号的行数。
ids=%w[1 2 11 12 21 22 9 10 19 20 29 30]
ss=ids.join "|"
ss="(?:#{ss})"
#puts ss
#exit
while line = ARGF.gets
puts line.strip if line =~ %r@_#{ss}_@
end
scan 似乎必须用map,否则返不回正确的结果
ss.scan(/(\"\S+\")/).map{|e| e[0]}.join ","
数组
inject
a=["a", "b", "c"]
a.inject(0){|s, e| s+e.bytes[0]}
如果 a 是 字符,就用 e[0]
反之是 97.chr