Обратное сопоставление строк

Так в основном то, что я хочу сделать, использовать a grep,sed или awk команда (я не придирчив), который может сделать следующее. Я знаю, как пойти от Vuln 1 кому: OS1 но не наоборот.

Вход:

test.txt 
Vuln 1
 OS1
 OS2
 OS3

Vuln 2
 OS4
 OS5

Вывод (тяжелый псевдокод):

$ grep "OS1" test.txt
Vuln 1
0
задан 30 October 2015 в 20:18

3 ответа

В этом решении мы используем GNU AWK.

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

Объяснение

  • мы проводим пустую строку как разделитель записей (RS="")
  • , поля разделяются новыми строками (-F"\n")
  • , программа: если мы находим "OS1" в записи, печатаем первое поле (/OS1/ {print $1})
1
ответ дан 28 July 2019 в 10:05

Я предполагаю, это - то, в чем Вы нуждаетесь:

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

Объяснение:

  1. perl -ne читает вход linewise
  2. chomp удаляет новую строку в конце (не необходимый, но я думаю, это более чисто),
  3. Переменная $h содержит содержание строки, если это запускается с V
  4. $h печатается, если текущая строка содержит OS1
1
ответ дан 28 July 2019 в 10:05

Можно сделать:

grep -Pzo '\n?\KVuln 1(?=\n\s*OS1\n)' test.txt
  • Мы используем PCRE (-P) и ASCII NUL как входной разделитель строки (-z) вместо \n так, чтобы мы могли соответствовать \n буквально

  • \n?\K будет соответствовать дополнительной новой строке перед нашим желаемым Vuln 1, \K отбросит соответствие

  • (?=\n\s*OS1\n) нулевая ширина положительный предварительный шаблон, гарантирующий это Vuln 1 сопровождается OS1 в a \n разделенная строка.

Пример:

$ 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
0
ответ дан 28 July 2019 в 10:05

Другие вопросы по тегам:

Похожие вопросы: