#!/usr/bin/env ruby def eqon(a,b) (yield a) == (yield b) end s = ARGF.read def section start; /#{start}.+?(?=(?:#{start}|\z))/m; end def line start; /^#{start}.+/; end def lines start; /(?:#{line start}\n)+/m; end hunks = section /^diff/ hunk = section /^@@[^\n]*@@/ minus = lines /-/ plus = lines /\+/ minusplus = /(?:#{minus }|#{plus})+/m s.gsub!(hunks) { |hs| r = hs.gsub(hunk) { |h| h.scan(minusplus).reject { |c| eqon(minus, plus) { |r| c.scan(r).map{ |l| l.gsub(/^./,"").gsub(/\s+/m,"") } } }.empty? ? "" : h # }.empty? ? h : "" # uncomment this to see what nitpicking would get removed } r.scan(hunk).empty? ? "" : r } puts s