Published .
#!/usr/bin/env raku my sub tmp-edit(Str $s) { my $tmp = "/tmp/rged-{('a'..'z').roll(8).join}".IO; $tmp.spurt: $s; shell("%*ENV<EDITOR> $tmp"); my $new = $tmp.slurp; shell("rm $tmp"); $new } my regex Location { ^^ $<file>=(\S+) [':'|'-'] $<line>=(\d+) [':'|'-'] } my sub blocks(Str $input) { $input .split(/^^'--'$$/) .map({ .split(&Location, :v) .skip .rotor(2) .map(<start text> Z=> *) .rotor(2 => -1) .map({ (|$_[0], "end" => %($_[1].cache)<start>).Hash }) }) } sub MAIN($search) { my $input = run(<rg --engine=auto -n -C5>, $search, :out).out.slurp(:close); for blocks(tmp-edit($input)).reverse -> @bs { my $f = @bs[0]<start><file>.IO; my @l = $f.IO.slurp.lines; for @bs -> %b { @l.splice(%b<start><line> - 1, %b<end><line> - %b<start><line>, %b<text>.lines) } say "Writing $f..."; $f.spurt(@l.join("\n") ~ "\n"); } }