Логическое И и ИЛИ с grep

428
user9371654

Я хочу извлечь строки, которые соответствуют следующей логической операции:

"AB+CD" AND ("nonAB+nonCD" OR "nonAB+CD"). 

Это означает, что я хочу строки с:

AB+CD,nonAB+nonCD AB+CD,nonAB+CD AB+CD,nonAB+nonCD,nonAB+CD 

Это означает, что я ищу строки с "AB + CD" с одним или обоими ("nonAB + nonCD" ИЛИ "nonAB + CD").
Обратите внимание, что + является частью строки. Я хочу рассматривать это как строку (символ), а не арифметическую операцию.

Я использовал pipe для выполнения AND. И использовать \ | для операционной. Итак, моя команда:

grep ',AB+CD' test.txt | grep ',nonAB+nonCD\|,nonAB+CD' 

Первый |для труб. Вторым является логическое ИЛИ для grep согласно этой ссылке, которая дает этот пример для логического ИЛИ с grep:

grep 'pattern1\|pattern2' filename 

Результат, который мне представляется в терминале, окрашивает (находит) вторую часть команды. Первая часть (до того, как труба |не выделена в цветном результате. Мой вопрос:

1) Правильна ли моя команда?

2) Как раскрасить полные выводы команды?

0
Экранирующие последовательности для окрашивания вывода генерируются только на выходе терминала: при передаче в канал они могут помешать последующему совпадению. Поэтому вам нужно будет сделать все совпадение одним вызовом `grep`. Это должно быть возможно с помощью `grep -E` (или` egrep`), и я посмотрю на строку возможного совпадения. В ваших примерах `AB + CD` предшествует` nonAB`: всегда ли это так? Ваш двойной поиск будет совпадать, даже если `AB + CD` появится позже. AFH 6 лет назад 0
Нет конкретного заказа в моем случае. Просто `AB + CD` является обязательным. Тогда другим `, nonAB + nonCD` или`, nonAB + CD` необходимо сопоставить хотя бы одно из них. user9371654 6 лет назад 0
Некоторые первоначальные тесты показывают, что совпадение должно принимать форму `pattern1. * Pattern2`, что означает, что все промежуточные символы между двумя шаблонами будут частью совпадения и поэтому будут окрашены. Будет ли это удовлетворительным? AFH 6 лет назад 0

1 ответ на вопрос

0
Toto

Используя -Pопцию (PCRE):

grep -P 'AB\+CD,(?:nonAB\+nonCD|nonAB\+CD)' file.txt 

Выход:

AB+CD,nonAB+nonCD AB+CD,nonAB+CD AB+CD,nonAB+nonCD,nonAB+CD 

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