Para grep a palavra exata

0

Arquivo de amostra:

t2csi1m9@olth101 [bundleversion_sync]$ cat 1
arun:1.0
arun_kumar:1.2
arun-vinoth:1.3
arun_arun:1.4
t2csi1m9@olth101 [bundleversion_sync]$

t2csi1m9@olth101 [bundleversion_sync]$ grep -w 'arun' 1
arun:1.0
arun-vinoth:1.3
t2csi1m9@olth101 [bundleversion_sync]$

Quando eu participo arun no arquivo 1 , estou obtendo 2 saídas onde preciso apenas da primeira. (%código%).

    
por Arun 08.09.2017 / 08:16

2 respostas

2

Sim, você recebe duas correspondências porque ambos arun:1.0 e arun-vinoth:1.3 contêm a palavra arun como uma palavra separada, terminando antes dos caracteres não pertencentes à palavra : e - nos dois resultados ( _ é considerado um caractere de palavra, e é por isso que arun_kumar:1.2 não é retornado com seu comando).

Nesse caso, seria melhor usar ^arun: como padrão a ser pesquisado, ou seja, qualquer linha que comece com a string arun: .

    
por 08.09.2017 / 08:22
2

A definição de palavra para grep -w é uma sequência de caracteres alfanuméricos ou de sublinhado (na localidade ou limitada a ASCII dependendo da implementação / versão e com variações de comportamento se o que você procura para não iniciar ou terminar em caracteres de palavras).

Algumas ferramentas como zsh , vim , xterm permitem personalizar a definição de palavra . Mas não é qualquer implementação grep que eu conheço. Então, se você precisar de outra definição de palavra , precisará implementá-la de outra forma.

Por exemplo, se a sua definição de palavra deve ser qualquer seqüência de caracteres diferente de dois pontos , você faria:

grep -E '(^|:)arun(:|$)'

( arun após ( | ) o início da linha ( ^ ) ou : e seguido por : ou o final da linha ( $ )).

Ou com expressões regulares básicas padrão:

grep '^\(.*:\)\{0,1\}arun\(:.*\)\{0,1\}$'

(o início da linha ( ^ ), opcionalmente ( \{0,1\} ) seguido por uma sequência de caracteres ( .* ) terminando em : , seguido por arun , seguido opcionalmente por uma sequência de caracteres começando com : e o final da linha ( $ )).

Ou com PCRE (além da variante ERE acima também suportada pelo PCRE)

grep -P '(?<![^:])arun(?![^:])'

( arun , desde que não ( (?<!...) operador de look-behind negativo), nem seguido ( (?!...) operador de look-ahead negativo) por um caractere diferente de : ( [^:] ); aquele que você também pode usar com grep -o (para produzir somente a palavra), grep -b (para retornar seu deslocamento dentro da entrada), grep --color (para realçar a palavra) como com -w )

Ou se a sua definição palavra deve ser a palavra normal ( [[:alnum:]_] ) mais o hífen:

grep -E '(^|[^[:alnum:]_-])arun([^[:alnum:]_-]|$)'

e assim por diante.

    
por 08.09.2017 / 10:34

Tags