У меня есть файл, который имеет несколько строк, имеющие следующую структуру:Регулярного выражения для нескольких линий с отрицанием
Text line1: xxxx
Text line2: x
OS: "MacOS"
NotOS: "Linux"
Text line3:
ID: 12345
ИЛИ
Text line1: xxxx
Text line2: x
OS: "MacOS|Linux|Red Hat|Windows|Ubuntu|CentOS|Fedora"
NotOS: "HP-UX"
Text line3:
ID: 12345
Я ищу, чтобы получить все идентификаторы, которые имеют «CentOS "в поле ОС, но без" Linux "в поле NotOS. Я использовал следующее, который работает для меня какой-то степени, но не полностью:
grep -n 'OS\:.*[c|C]ent[o|O][s|S][\S+\n\r\s]+VulnID:' filename |\
grep -v '[L|l][I|i][N|n][U|u][X|x]|Amazon|Amazon Linux'
Он стремится вернуть это:
15386:OS: "Linux|AIX|Solaris|VMware|FreeBSD|IRIX|NetBSD|OpenBSD|BSD|Fedora|Ubuntu|Red.*Hat|CentOS|OpenSuSE|SuSE|MacOS|Oracle Enterprise Linux|HP-UX"
15404:OS: "SuSE|Linux|AIX|BSD|CentOS|Solaris|HP-UX"
15527:NotOS: "(Unknown|CentOS|Red Hat|Ubuntu|Oracle Enterprise Linux|Debian|Fedora|AIX|SuSE|Solaris)"
15537:NotOS: "(Unknown|CentOS|Red Hat|Ubuntu|Oracle Enterprise Linux|Debian|Fedora|AIX|SuSE|Solaris)"
15705:OS: "Solaris|Linux|CentOS"
где первые цифры номера строк, но это обыкновение возвращать текст с "ID:"
Как это сделать?
Используйте '-i' для нечувствительности к регистру, поэтому вам не нужно писать' [c | C] '. Кроме того, вы не должны ставить '|' там, это должно быть просто '[cC]'. – Barmar
Спасибо, Бармар! Я новичок, только начинаю с моего Linux-путешествия. – Metahuman