反向字符串匹配

反向字符串匹配

所以基本上我想要做的是使用grep,sedawk命令(我不挑剔)来执行以下操作。我知道如何从 到 ,Vuln 1OS1不知道反之亦然。

输入:

test.txt 
Vuln 1
 OS1
 OS2
 OS3

Vuln 2
 OS4
 OS5

输出(重伪代码):

$ grep "OS1" test.txt
Vuln 1

答案1

我想,这就是你所需要的:

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

解释:

  1. perl -ne逐行读取输入
  2. chomp删除末尾的换行符(不是必需的,但我认为,这样更简洁)
  3. 如果行以以下形式开头,则变量$h包含该行的内容V
  4. $h如果当前行包含OS1

答案2

在这个解决方案中我们使用 GNU AWK。

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

解释

  • 我们以空行作为记录分隔符(RS=""
  • -F"\n"字段之间用换行符 ( )分隔
  • 程序是:如果我们在记录中找到“OS1”,则打印第一个字段(/OS1/ {print $1}

答案3

你可以做:

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中。\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

相关内容