Filename: Private: No Yes Filetype: Auto ABAP Sophia Apex Azure CLI Batch Bicep C Cameligo Clojure CoffeeScript C++ C# CSP CSS Cypher Dart Dockerfile ECL Elixir Flow9 FreeMarker2 FreeMarker2 (Angle/Bracket) FreeMarker2 (Angle/Dollar) FreeMarker2 (Auto/Bracket) FreeMarker2 (Auto/Dollar) FreeMarker2 (Bracket/Bracket) FreeMarker2 (Bracket/Dollar) F# Go GraphQL Handlebars Terraform HTML Ini Java JavaScript Julia Kotlin Less Lexon Liquid Lua Modula-3 Markdown MDX MIPS DAX MySQL Objective-C Pascal Pascaligo Perl PostgreSQL PHP Plain text ATS PQ PowerShell Protobuf Pug Python Q# R Razor Redis Redshift ReStructuredText Ruby Rust Small Basic Scala Scheme Sass Shell Solidity SPARQL SQL StructuredText Swift SV Tcl Twig TypeScript TypeSpec Visual Basic V WebGPU Shading Language XML YAML Indentation: Spaces Tabs 1 2 3 4 5 6 7 8 Clone #!/usr/bin/env ruby if ARGV.first == '-h' || ARGV.first == '--help' puts "Usage: #{$0} [file.srt...]" exit! end subs = if ARGV.any? ARGV.map { |fn| [fn, File.read(fn)] } else [['-', STDIN.read]] end.to_h subs.each do |fn, data| last_from = nil last_to = nil frames = [] data.split("\n\n").each do |frame| _, from, to, line = *frame.strip.match( /(\d+:\d+:\d+,\d+) --> (\d+:\d+:\d+,\d+)(.*)/m ) if from == last_from && to == last_to frames.last << "\r\n#{line.strip}" else STDERR.puts("!! WARNING: Possibly buggy frame #{from} --> #{to}") if from == last_from || to == last_to frames << "#{from} --> #{to}\n#{line.strip}" last_from = from last_to = to end end sub = frames.each_with_index.map { |frame, idx| "#{idx + 1}\n#{frame}\n" }.join("\n") if fn == '-' puts(sub) else File.write(fn, sub) end end Paste