#!/usr/bin/env perl use strict; my $counter; my %mapping; # mapping of digits my %footnote; while (<>) { for my $number (m/\[(\d+)\]/g) { if (exists($mapping{$number})) { s/\[$number\]/[$mapping{$number}]/; next; } $counter++; $mapping{$number} = $counter; s/\[$number\]/[$counter]/; } print; last if (m/^\@footnote?:/); } die "missing footer" if eof; while (<>) { my ($number) = m/^\[(\d+)\]/g; unless (exists($mapping{$number})) { warn("ignoring unused note: $_\n"); next; } s/^\[$number\]/[$mapping{$number}]/; $footnote{$mapping{$number}} = $_; } for my $number (sort { $a <=> $b } keys(%footnote)) { print $footnote{$number}; } __DATA__ A great brown fox [13] jumped of a pile of lorem ipsum [4], [7]. He met with a silver penguin, browsing the Linux Kernel Mailinglist [3]. They debated whether to start C-programs with "main (int argc, char **argv)" or with "main (int argc, char *argv[])". Brackets annoyed them [9999]. @footnote: [13] Al Fabetus: "On characters and animals", 1888, self published. [4] Lorem Ipsum, Web Link [9999] Annoying Link. [7] B. Fox: "More on Blind Text". [3] Linux Kernel Maintainers: LKML