2010-05-21 18 views
44

Sto usando il seguente comando a grep roba in subdirsCome Grep per l'intera parola

find . | xargs grep -s 's:text' 

Tuttavia, questo trova anche roba come <s:textfield name="sdfsf"...../>

Cosa posso fare per evitare che così solo trova roba come <s:text name="sdfsdf"/>

o per quella materia .... trova anche <s:text somethingElse="lkjkj" name="lkkj"

fondamentalmente s:text e name dovrebbero essere sulla stessa riga ....

+17

Qualcuno ha letto il titolo di "come grep per tutto il mondo ** **"? – Earlz

+1

per il lulz :) – josh

+7

@Earlz, no, principalmente perché ho cercato su google "grep whole word". –

risposta

49

Si desidera l'opzione -w per specificare che è la fine di una parola.

find . | xargs grep -sw 's:text'

0

Se si desidera filtrare la parte di testo rimanente, è possibile farlo.

xargs grep -s 's:text '

Questo dovrebbe trovare solo s:text casi con uno spazio dopo l'ultimo t. Se hai bisogno di trovare le istanze s:text che hanno solo un elemento nome, inserisci i tuoi risultati in un'altra espressione grep o usa espressioni regolari per filtrare solo gli elementi di cui hai bisogno.

+0

e se il "testo" è alla fine dell'output? Non verrà saltato nella tua soluzione? – pkuszewski

22

È possibile eliminare il comando xargs facendo ricerca grep ricorsivo. E normalmente non hai bisogno della bandiera 's'. Quindi:

grep -wr 's:text' 
23

Usa \b per abbinare sui "confini di parola", che renderanno la vostra partita di ricerca solo su parole intere.

Così il vostro grep sarebbe simile

grep -r "\bSTRING\b" 

l'aggiunta di numeri di colore e la linea potrebbe aiutare anche

grep --color -rn "\bSTRING\b" 

Da http://www.regular-expressions.info/wordboundaries.html:

ci sono tre diverse posizioni che si qualificano come limiti di parole:

  • Prima del primo carattere nella stringa, se il primo carattere è un carattere di parola .
  • Dopo l'ultimo carattere nella stringa, se l'ultimo carattere è un carattere di parola.
  • Tra due caratteri nella stringa, dove uno è un carattere di parola e l'altro non è un carattere di parola.
0

si potrebbe provare rg, https://github.com/BurntSushi/ripgrep:

rg -w 's:text' . 

dovrebbe farlo

+0

Sebbene questo collegamento possa rispondere alla domanda, è meglio includere qui le parti essenziali della risposta e fornire il link per riferimento. Le risposte di solo collegamento possono diventare non valide se la pagina collegata cambia. - [Dalla recensione] (/ recensione/post di bassa qualità/17780631) –

+1

Ho fornito la risposta: rg -w 's: text'. – ms4720