#!/usr/bin/env ruby def is_include str str.start_with? '#include' end files = ARGV if files.empty? default = "src/**/*.[ch]" puts "no arguments passed, defaulting to #{default}" files = Dir[default] end files.each { |path| File.open(path, "r+") do |file| lines = file.readlines last = nil grouped = [] lines.each do |line| if is_include(line) != last grouped << [line] last = is_include(line) else grouped[-1] << line end end grouped.map do |group| group.sort! if is_include group[0] end grouped = grouped.flatten next if grouped == lines puts path file.truncate(0) file.seek(0) file.write grouped.join end }