ОБНОВЛЯТЬ:

ОБНОВЛЯТЬ:

Я передаю вывод одной 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вы можете просто поменять местами greps:

echo A B C | grep m | grep --color=always A

В качестве альтернативы, если вы ищете литерал mв исходном выводе, вам нужно будет исключить все цветовые коды перед этим, grep mно вывести результатсцветовые коды. Один из способов сделать это — использовать nlдля нумерации строк вывода, grepдля номера строки, за которым следует m, сохранить только номера строк из этого вывода, а затем использовать sed -nдля печати только строк в цветовом коде вывода.

Связанный контент