Correspondência de strings reversas

0

Então, basicamente, o que eu quero fazer é usar o comando grep , sed ou awk (não sou exigente) que pode fazer o seguinte. Eu sei como ir de Vuln 1 para OS1 , mas não vice-versa.

Entrada:

test.txt 
Vuln 1
 OS1
 OS2
 OS3

Vuln 2
 OS4
 OS5

Saída (pseudocódigo pesado):

$ grep "OS1" test.txt
Vuln 1
    
por Roboman1723 30.10.2015 / 16:47

3 respostas

1

Acho que é disso que você precisa:

perl -ne 'chomp; $h=$_ if $_=~/^V/; print $h,"\n" if $_=~/OS1/' test.txt

Explicação:

  1. perl -ne lê a entrada linearmente
  2. chomp remove a nova linha no final (não é necessário, mas acho que é mais limpo)
  3. A variável $h contém o conteúdo da linha, se começar com V
  4. $h é impresso se a linha atual contiver OS1
por Wayne_Yux 30.10.2015 / 17:07
1

Nesta solução, usamos o GNU AWK.

awk -F"\n" -v RS="" '/OS1/ {print $1}' test.txt

Explicação

  • tomamos uma linha vazia como um separador de registro ( RS="" )
  • Os campos
  • são separados por novas linhas ( -F"\n" )
  • o programa é: se encontrarmos "OS1" no registro, imprima o primeiro campo ( /OS1/ {print $1} )
por JJoao 03.11.2015 / 10:34
0

Você pode fazer:

grep -Pzo '\n?\KVuln 1(?=\n\s*OS1\n)' test.txt
  • Estamos usando PCRE ( -P ) e ASCII NUL como delimitador de linha de entrada ( -z ) em vez de \n , para que possamos corresponder a \n literalmente

  • \n?\K corresponderá a uma nova linha opcional antes que o desejado Vuln 1 , \K descarte a correspondência

  • (?=\n\s*OS1\n) é o padrão lookahead de largura zero garantindo que Vuln 1 seja seguido por OS1 em uma linha separada \n .

Exemplo:

$ cat test.txt 
Vuln 1
 OS1
 OS2
 OS3

Vuln 2
 OS4
 OS5

$ grep -Pzo '\n?\KVuln 1(?=\n\s*OS1\n)' test.txt 
Vuln 1
    
por heemayl 30.10.2015 / 18:16