web-dev-qa-db-ja.com

grep --ignore-case --only

--ignore-caseオプションと--only-matchオプションの両方を使用すると、grepが失敗します。例:

$ 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]のような回避策を使用することもできますが、これは良い選択肢ではないようです。

68
schatten

これは、最初の2.5.1では knownbug であり、バグレポートによると2007年前半(Redhat 2.5.1-5)で修正されています。残念ながら、Appleは Mac OS X 10.7.2 でも2.5.1を使用しています。

Homebrew(3.0) または MacPorts(2.26) または fink(3.0-1) で新しいバージョンを入手できます。


編集:報告されたgrepバージョンはまだ2.5.1ですが、OS X 10.11(またはそれ以前)で修正されたようです。

45
kennytm

お使いのバージョンのgrepに問題があるはずです。

あなたのテストケースは私のマシンでここで正しく動作しています:

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

そして私のバージョンは:

$ grep --version
grep (GNU grep) 2.10
9
Felix Yan

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
2
grepit

-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
0
Matt Lacey