Assumindo que você quer dizer "entre" meses atrás "e" http: // "', esse script perl
faz o que você quer:
#! /usr/bin/perl
use strict;
my $join=0;
while(<>) {
if (m/ ago$/) { $join=1 };
if (m/http:\/\//) { $join=0 ; s/[[:blank:]]/_/g; };
if ($join == 1) {
s/\s/_/g;
s/_(seconds|minutes|hours|days|weeks|months|years|ago_)/ $1/g;
};
print;
}
OBSERVAÇÃO: usei deliberadamente [[:blank::]]
em vez de \s
na primeira operação s///
acima, para que ela altere somente espaços e guias nessa linha, não em novas linhas. Com a segunda subestação, quero que ela substitua todos os tipos de espaços, incluindo novas linhas (exceto o espaço imediatamente anterior a months ago
e o espaço entre months
e ago
).
Saída:
lots of text...
page_5.html months ago___This_is_the_password:_6743412_<http://website.com_etc...
more text...
Isso também pode ser escrito como uma linha, usando perl -p
:
perl -p -e 'if (m/ ago/) { $join=1 }; if (m/http:\/\//) { $join=0 ; s/[[:blank:]]/_/g; }; if ($join == 1) {s/\s/_/g}; s/_(seconds|minutes|hours|days|weeks|months|years|ago_)/ $1/' speld.txt