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

По данным справочной страницы:

   -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], но это не очень хороший вариант.

65 голосов | спросил schatten 14 WedEurope/Moscow2011-12-14T05:07:34+04:00Europe/Moscow12bEurope/MoscowWed, 14 Dec 2011 05:07:34 +0400 2011, 05:07:34

4 ответа


0

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


Редактировать. По-видимому, это было исправлено в OS X 10.11 (или, возможно, ранее), даже несмотря на то, что версия grep, о которой сообщалось, все еще 2.5.1.

ответил kennytm 14 WedEurope/Moscow2011-12-14T05:17:47+04:00Europe/Moscow12bEurope/MoscowWed, 14 Dec 2011 05:17:47 +0400 2011, 05:17:47
0

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

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

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

И моя версия:

$ grep --version
grep (GNU grep) 2.10
ответил Felix Yan 14 WedEurope/Moscow2011-12-14T05:10:37+04:00Europe/Moscow12bEurope/MoscowWed, 14 Dec 2011 05:10:37 +0400 2011, 05:10:37
0

Если ваш 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
ответил grepit 9 Jpm1000000pmWed, 09 Jan 2013 22:23:23 +040013 2013, 22:23:23
0

Я бы предположил, что -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
ответил Matt Lacey 14 WedEurope/Moscow2011-12-14T05:11:59+04:00Europe/Moscow12bEurope/MoscowWed, 14 Dec 2011 05:11:59 +0400 2011, 05:11:59

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

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132