pegue de um arquivo de texto um intervalo usando duas variáveis como os parâmetros de início e fim

3

Eu estou tentando pegar um intervalo específico de linhas de um arquivo de texto usando o grep; o intervalo de linhas precisa ser identificado por duas variáveis. Até agora, eu tenho tentado fazer isso usando os exemplos curinga '*' de tentativas falhas incluem: (Eu posso ver porque os dois primeiros não deveriam funcionar, mas ficaram desesperados e esperaram por um milagre)

grep "$Var1"*"$Var2" file.txt     
grep "$Var1*$Var2" file.txt
echo "$Var1*$Var2" | grep file.txt

Estou começando a achar que estou me aproximando completamente errado, então fique à vontade para sugerir alternativas ao grep.

    
por Giles 09.12.2016 / 17:18

1 resposta

3

grep não foi projetado para pesquisar padrões em várias linhas. Existem outras ferramentas mais adequadas para esta tarefa: awk e sed .

Como você está usando variáveis para manter os padrões, as coisas podem ficar complicadas. Por favor, tente primeiro com padrões codificados. Se você acertar, tente substituir os padrões codificados por variáveis.

Usando awk :

awk '/'"$Var1"'/,/'"$Var2"'/' file.txt

O mesmo comando com padrões codificados para explicar o conceito:

awk '/pattern1/,/pattern2/' file.txt

Explicação:

  • /pattern1/,/pattern2/ é um intervalo. o intervalo começa na linha que corresponde a pattern1 e termina na linha que corresponde a pattern2 .
  • por padrão awk apenas imprime linhas que estão no intervalo.

Saiba mais sobre awk : link

Usando sed :

sed -n '/'"$Var1"'/,/'"$Var2"'/ p' file.txt

O mesmo comando com padrões codificados para explicar o conceito:

sed -n '/pattern1/,/pattern2/ p' file.txt

Explicação:

  • -n faz sed para imprimir linhas apenas se for contada.
  • /pattern1/,/pattern2/ é um intervalo. o intervalo começa na linha que corresponde a pattern1 e termina na linha que corresponde a pattern2 . para cada linha desse intervalo, os seguintes comandos são executados.
  • o p no final informa sed para imprimir linhas.

Saiba mais sobre sed : link

Se realmente precisar usar grep , você poderá usar -P para informar grep para usar o mecanismo de expressão regular perl. A página man tem isso a dizer sobre esse recurso:

Interpret the pattern as a Perl-compatible regular expression (PCRE). This is highly experimental and grep -P may warn of unimplemented features.

    
por 09.12.2016 / 17:31