Como apagar todas as linhas antes e depois das strings específicas no arquivo?

2

Eu toquei com o Powergrep e expressões regulares, mas não sei como fazer isso:

Eu tenho o arquivo de texto (código-fonte da página da Web) e desejo excluir todo o texto (muitas linhas) antes da string específica no código: STRING1 (tag html) e também todo o texto depois de outro específico string: STRING2 . Essas strings aparecem apenas uma vez no código-fonte.

    
por Juha 31.03.2015 / 11:42

2 respostas

2

Abra um Terminal pressionando Ctrl + Alt + T e use o comando abaixo de um linear. Não se esqueça de alterar o nome do arquivo de entrada para o seu.

Usando awk :

awk -v FS="(STRING1|STRING2)" '{print }' inputfile > outputfile

Usando grep :

grep -Pzo "(?<=STRING1)(.|\n)*(?=STRING2)" inputfile > outputfile

ou com o modificador DOTALL (Pontos de Partidas de Correspondência de Linhas). Faz com que . corresponda até mesmo a \n ew caracteres de linha.

grep -Pzo "(?s)(?<=STRING1).*?(?=STRING2)" inputfile > outpuffile

O (?s) ativa o DOTALL para o grep.

ou como outra alternativa para corresponder aos caracteres de linha \n ew, basta usar:

grep -Pzo "(?<=STRING1)[\s\S]*(?=STRING2)" inputfile > outpuffile

Em homem grep :

-o, --only-matching
      Print only the matched (non-empty) parts of a matching line,
      with each such part on a separate output line.

-P, --perl-regexp
      Interpret PATTERN as a Perl compatible regular expression (PCRE)

-z, --null-data
      Treat the input as a set of lines, each terminated by a zero byte (the ASCII 
      NUL character) instead of a newline. Like the -Z or --null option, this option 
      can be used with commands like sort -z to process arbitrary file names.

(?<=pattern) : conhecido como Lookbehind positivo . Um par de parênteses, com o parêntese de abertura seguido por um ponto de interrogação, símbolo "menor que" e um sinal de igual.

Portanto, o (?<=STRING1).*? (lookbehind positivo) corresponde a 0 ou mais ocorrências de quaisquer caracteres (que são opcionais devido ao uso de ? após .* ) seguido por STRING1 de inputfile .

(?=pattern) : conhecido como Lookahead positivo : o constructo lookahead positivo é um par de parênteses, com o parêntese de abertura seguido por um ponto de interrogação e um sinal de igual.

Assim, o .*?(?=STRING2) : (lookahead positivo) corresponde a 0 ou mais ocorrências de qualquer caractere seguido por STRING2 .

Links para ler mais:
Tópicos Avançados do Grep
GREP para Designers

    
por αғsнιη 31.03.2015 / 12:18
0

Você pode fazer isso com este comando:

sed -e '/STRING1/,/STRING2/!d' inputfile > outputfile
    
por Helio 31.03.2015 / 11:58