Substituição de espaços (isto é, “”) ou novas linhas (isto é, retorno de carro) com sublinhados - caso especial

0

Eu quero substituir espaços (por exemplo, "") ou novas linhas (isto é, retorno de carro) com sublinhados em um caso especial - quando ocorrem entre duas cadeias específicas.

Eu tenho páginas html e quero substituir os espaços em branco e as novas linhas por sublinhados quando ocorrem entre duas strings específicas.

Exemplo:

lots of text...
page_5.html months ago


This is the password: 6743412 <http://website.com etc...
more text...

Eu quero ir de cima para baixo:

lots of text...
page_5.html months ago__This_is_the_password:_6743412_<http://website.com etc...
more text...

Basicamente, quero fazer a substituição apenas entre as strings ago e <http

É html repetitivo, então, se eu puder fazer isso funcionar, será muito útil e fácil extrair o texto modificado depois.

Algo usando sed ou awk seria melhor para mim.

    
por speld_rwong 08.05.2016 / 05:01

4 respostas

0

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
    
por 08.05.2016 / 05:28
0

Um snippet do Python:

#!/usr/bin/env python3
import re
with open('file.txt') as f:
    f = f.read()
    spl = re.split(r'(\sago\n|<http://)', f)
    des = re.sub(r'\s', '_', spl[2])
    print(spl[0] + spl[1].replace('\n', '') + des + ''.join(spl[3:]), end='')

O arquivo é dividido em partes levando ago\n e <http:// como delímetros usando re.split . Então o valor no índice 2 é a parte desejada onde as substituições precisam ser feitas. Finalmente, o arquivo é impresso no padrão desejado.

    
por 08.05.2016 / 10:47
0

Perl:

perl -0777 -pe 's{(?<=\bago\b)(.+)(?=<http)}{ ($repl=$1) =~ s/\s/_/g; $repl }sge' file

Notas:

  • -0777 faz slurps no arquivo em uma única string
  • o comando "outer" s/// localiza todas as subseqüências que você deseja modificar
  • o comando "inner" s/// substitui todos os espaços em branco por sublinhados.
por 08.05.2016 / 14:50
0

use o vim, um comando do seu terminal fará isso:

vim -c '%s/ ago\n*/ ago__/g|wq' original.txt

original.txt é modificado, então certifique-se de fazer o backup primeiro

    
por 09.05.2016 / 12:41