Для выполнения задачи вы можете попробовать метод экранирования:
- Защитите строки, содержащие дубликаты, поскольку такие строки должны быть исключены.Затем вы можете удалить их, если необходимо.
- Сопоставить все строки, содержащие слова из набора.
Итак, пример текста:
Some text
123 baz bar foo
123 bar baz foo
123 foo baz bar
123 foo baz bar foo boo
123 foo bar bar
123 boo baz foo asdf
Some other text
Всначала мы должны найти дубликаты, содержащие строки, используя следующее регулярное выражение:
(^.*(foo|bar|baz|boo|123).*\2)
Предыдущее означает: взять текст из начала строки, содержащий хотя бы одно дублирующее слово среди набора, заканчивающегося совпадающим дубликатом.
Затем экранируйте эти строки с помощью замены с помощью регулярных выражений:
#SHIELD#\1
Мы получим следующий текст:
Some text
123 baz bar foo
123 bar baz foo
123 foo baz bar
#SHIELD# 123 foo baz bar foo boo
#SHIELD# 123 foo bar bar
123 boo baz foo asdf
Some other text
Или удалите эти строки, если необходимо.
Тогда мы сможем получить необходимые строки от остальных.Отметим их заменой:
Найти: ^(?!#SHIELD#)(\s*123.*(baz|bar|foo|boo).*)$
(искать только неэкранированные строки, начинающиеся с пробелов, 123, а затем любой текст, содержащий хотя бы одно совпадение из набора).
Заменить на: #MYLINE#\1
Получим текст:
Some text
#MYLINE# 123 baz bar foo
#MYLINE# 123 bar baz foo
#MYLINE# 123 foo baz bar
#SHIELD# 123 foo baz bar foo boo
#SHIELD# 123 foo bar bar
#MYLINE# 123 boo baz foo asdf
Some other text