grep --ignore-case -- only



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 page:




   -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], но это не кажется хорошим вариантом.

571   4  

4 ответов:

Это известныйошибка на начальном 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) или Финк (3.0-1).


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

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

ваши тестовые случаи работают правильно здесь, на моей машине:

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

и моя версия:

$ grep --version
grep (GNU grep) 2.10

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

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

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

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

2.или в вашем случае, если вы просто повторяете что-то

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

Я бы предположил, что -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

Comments

    Ничего не найдено.