#!/usr/bin/env perl # all in memory use strict; my %mapping; # mapping of digits my @definitions; undef $/; # read in one go my $counter = 1; my $part = 0; for( split /(\n\@footnotes:\n)/, <> ) { if( ++$part == 1 ) { s/\[(\d+)\]/'['.($mapping{$1} ||= $counter++).']'/ge; print; } elsif( $part == 2 ) { print; } else { for( split /^/ ) { /^ \[ (\d+) \] (.*)/x or print, next; exists $mapping{$1} or warn("ignoring unused note: $_"), next; $definitions[$mapping{$1}] = $2; } } } for my $i ( 1..$#definitions ) { print "[$i]$definitions[$i]\n"; }