2011-12-14 21 views
54

grep non riesce quando si utilizzano entrambe le opzioni --ignore-caso e --only-match. Esempio:grep --ignore-case --only

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

Ma

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

Secondo la pagina 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. 

Si tratta di un bug di grep o non ho avuto la pagina della mappa?

Sto usando Mac OS X 10.6.8 e

$ grep --version 
grep (GNU grep) 2.5.1 

trovato questo link: http://lists.gnu.org/archive/html/bug-gnu-utils/2003-11/msg00040.html

Naturalmente è possibile utilizzare come soluzione grep -o [aA][bB][cC], ma questo non sembra essere un buona opzione

risposta

39

Questo è un knownbug sulla iniziali 2.5.1, ed è stato fissato nei primi mesi del 2007 (Redhat 2.5.1-5) in base alle segnalazioni di bug. Sfortunatamente Apple usa ancora la versione 2.5.1 anche su Mac OS X 10.7.2.

È possibile ottenere una versione più recente tramite Homebrew (3.0) o MacPorts (2.26) o fink (3.0-1).


Edit: A quanto pare è stato fissato su OS X 10.11 (o forse prima), anche se la versione riportata grep è ancora 2.5.1.

+0

Kenny, grazie! Quello che stai dicendo ha senso, cercherà di aggiornare. – schatten

5

Dovrebbe essere un problema nella tua versione di grep.

vostri test funzionino correttamente qui sulla mia macchina:

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

e la mia versione è:

$ grep --version 
grep (GNU grep) 2.10 
+0

2.6.3 funziona anche. – FakeRainBrigand

+0

Funziona per me su 2.5.1 su Red Hat Enterprise Linux 5. –

+1

Sembra che io abbia installato Red Hat 2.5.1-55, quindi è dopo la correzione di bug che @KennyTM riporta. –

0

Io suggerirei che il -i significa che fa match "ABC", ma la differenza è nell'output. -i non manipola l'input, quindi non cambierà "ABC" in "abc" perché hai specificato "abc" come pattern. -o dice che mostra solo la parte dell'output che corrisponde al modello specificato, non dice sull'input corrispondente.

L'uscita del echo "ABC" | grep -i abc è ABC, il -o mostra corrispondenza dell'uscita "abc" in modo da niente mostra:

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

Se grep -i non funziona, provare a utilizzare il comando tr per convertire l'output del file in minuscolo e quindi inserirlo in grep standard con quello che si sta cercando. (sembra complicato ma il comando effettivo che ho fornito per te non lo è!).

Si noti che il comando tr non modifica il contenuto del file originale, lo converte appena prima di inserirlo in grep.

1.here è come si può fare questo su un file

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

2.Or nel tuo caso, se si sta solo facendo eco qualcosa

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

Non modifica il contenuto, ma modifica il flusso in pipe, quindi non si otterrà un contenuto originale corrispondente del file. – schatten