Подтвердить что ты не робот

Grep --ignore-case - только

grep терпит неудачу при использовании параметров --ignore-case и -only-match. Пример:

$ echo "abc" | grep -io abc
abc
$ echo "ABC" | grep -io abc
$ 

Но

$ echo "abc" | grep -i abc
abc
$ echo "ABC" | grep -i abc
ABC

Согласно man-странице:

   -o, --only-matching
          Show only the part of a matching line that matches PATTERN.
   -i, --ignore-case
          Ignore case distinctions in both the PATTERN and the input files.

Является ли это ошибкой grep или я не получил страницу карты?

Я использую Mac OS X 10.6.8 и

$ grep --version
grep (GNU grep) 2.5.1

Найдено по этой ссылке: http://lists.gnu.org/archive/html/bug-gnu-utils/2003-11/msg00040.html

Конечно, можно использовать обходной путь, например grep -o [aA][bB][cC], но это не кажется хорошим вариантом.

4b9b3361

Ответ 1

Это известный bug на начальный 2.5.1, и был исправлен в начале 2007 года (Redhat 2.5.1-5) в соответствии с отчетами об ошибках. К сожалению, Apple по-прежнему использует 2.5.1 даже на Mac OS X 10.7.2.

Вы можете получить более новую версию через Homebrew (3.0) или MacPorts (2.26) или fink (3.0-1).


Edit: По-видимому, он был исправлен в OS X 10.11 (или, возможно, раньше), хотя версия grep, по-прежнему, 2.5.1.

Ответ 2

Это должно быть проблемой в вашей версии grep.

Ваши тестовые примеры работают правильно на моей машине:

$ echo "abc" | grep -io abc
abc
$ echo "ABC" | grep -io abc
ABC

И моя версия:

$ grep --version
grep (GNU grep) 2.10

Ответ 3

Если ваш grep -i не работает, попробуйте использовать команду tr, чтобы преобразовать вывод вашего файла в нижний регистр, а затем передать его в стандартный grep с тем, что вы ищете. (это звучит сложно, но фактическая команда, которую я вам предоставил, не является!).

Обратите внимание, что команда tr не изменяет содержимое исходного файла, а просто преобразует его непосредственно перед отправкой в ​​grep.

1. Вот как вы можете сделать это в файле

tr '[:upper:]' '[:lower:]' <your_file.txt|grep what_ever_you_are_searching_in_lower_case

2.or в вашем случае, если вы просто эхом отдаете что-то

echo "ABC"|tr '[:upper:]' '[:lower:]' | grep abc

Ответ 4

Я бы предположил, что -i означает, что он соответствует "ABC", но разница в выходе. -i не управляет входом, поэтому он не изменит "ABC" на "abc" , потому что вы указали "abc" в качестве шаблона. -o говорит, что он показывает только часть результата, которая соответствует указанному шаблону, он не говорит о совпадении ввода.

Вывод echo "ABC" | grep -i abc равен ABC, -o показывает соответствие вывода "abc" , поэтому ничего не отображается:

Naos:~ mattlacey$ echo "ABC" | grep -i abc | grep -o abc
Naos:~ mattlacey$ echo "ABC" | grep -i abc | grep -o ABC
ABC