
Я передаю вывод одной grep
команды в другую grep
. Первая grep
использует --color=always
, так что первое совпадение окрашено. На практике это означает, что совпадение заключено между двумя цветовыми кодами, т. е. \033[1;31m
и \033[0m
.
Теперь проблема в том, что если второй шаблон — m
, то он соответствует цветовому коду предыдущего совпадения:
echo A B C | grep --color=always A | grep m
31
Аналогично совпадет и число .
Есть ли способ обойти это?
ОБНОВЛЯТЬ:
Я предполагал, что само собой разумеется, что мне понадобится цветная спичка, поэтому избавление от нее --color=always
не является для меня удовлетворительным решением.
решение1
Не используйте grep --color=always
, именно поэтому в GNU grep
(и, возможно, других) также есть , grep --color=auto
что эквивалентно grep --color
одному (из man grep
):
--color[=WHEN], --colour[=WHEN]
Surround the matched (non-empty) strings, matching lines,
context lines, file names, line numbers, byte offsets, and
separators (for fields and groups of context lines) with escape
sequences to display them in color on the terminal. The colors
are defined by the environment variable GREP_COLORS. The
deprecated environment variable GREP_COLOR is still supported,
but its setting does not have priority. WHEN is never, always,
or auto.
Я не могу найти, где это описано более подробно, но по сути это определяет, является ли вывод grep
файлом, терминалом, каналом или чем-то еще, и действует соответствующим образом:
$ echo foo | grep --color=always o | grep m
f[01;31mo[m[01;31mo[m
$ echo foo | grep --color=always o >outfile; grep m outfile
f[01;31mo[m[01;31mo[m
Сравните вышесказанное с
$ echo foo | grep --color o >outfile; grep m outfile
$ echo foo | grep --color o | grep m
$
Итак, использование этой auto
опции в основном будет печатать цвета только тогда, когда вы их видите. Это действительно очень умно и работает как заклинание. Настолько, что у меня есть:
$ type grep
grep is aliased to `grep --color'
решение2
Если это имеет значение, то именно по этой причине --color
по умолчанию используется --color=auto
, а не --color=always
.
Если ваша цель — «Показать мне все строки, содержащие A
и , m
и выделить соответствующие символы A
и m
», то, по-видимому, самым простым решением будет выполнить всю подсветку после всех сопоставлений, используя один egrep для добавления подсветки обратно. Что-то вроде:
{
echo "A b";
echo "A m";
echo "B m";
echo "Another m";
} | grep 'A' | grep 'm' | egrep --color 'A|m';
решение3
Какой фактический вариант использования? Если вы хотите раскрасить код A
во всех строках, которые также содержат, m
вы можете просто поменять местами grep
s:
echo A B C | grep m | grep --color=always A
В качестве альтернативы, если вы ищете литерал m
в исходном выводе, вам нужно будет исключить все цветовые коды перед этим, grep m
но вывести результатсцветовые коды. Один из способов сделать это — использовать nl
для нумерации строк вывода, grep
для номера строки, за которым следует m
, сохранить только номера строк из этого вывода, а затем использовать sed -n
для печати только строк в цветовом коде вывода.