Ho un file di testo:

deiauk 1611516 afsdf 765 minkra 18415151 asdsf 4152 linkra sfsfdsfs sdfss 4555 deiauk1 sdfsfdsfs 1561 51 deiauk2 115151 5454 4 deiauk 1611516 afsdf ddfgfgd luktol1 4545 4 9 luktol 1 

e io desidera corrispondere esattamente a deiauk. Quando lo faccio:

grep "deiauk" file.txt 

ottengo questo risultato:

deiauk 1611516 afsdf 765 deiauk1 sdfsfdsfs 1561 51 deiauk2 115151 5454 4 

ma io ho solo bisogno di questo:

deiauk 1611516 afsdf 765 deiauk 1611516 afsdf ddfgfgd 

So che cè “unopzione -w, ma la mia stringa deve essere completamente riga.

Commenti

  • Hai effettivamente provato grep -w? (Questa opzione è esattamente per questo scopo e per me funziona.) – Nota: lopzione -x corrisponde allintera riga.
  • " Voglio trovare una corrispondenza esatta con deiauk / " Mi serve solo questo: deiauk 1611516 afsdf 765 " – di cosa hai bisogno?

Risposta

Prova uno di:

grep -w "deiauk" textfile grep "\<deiauk\>" textfile 

Commenti

  • Se hai un trattino () alla fine della stringa questo script lo porterà come risultato, cosa non prevista.
  • Correggi @Eve rt: le parole includono solo caratteri alfabetici, cifre e trattini bassi, quindi se hai abbreviazioni o altri elementi sillabati, questo non funziona.
  • @Cyrus ho imparato il secondo usando vi / vim * sulle parole.
  • Non funziona per nessun carattere speciale che ha, ad esempio org.apache.avro avro greped con org.apache.avro avro+mapred (provato con *)
  • Utilizza -wE per corrispondenza di più parole (booleano OR)

Risposta

Prova con GNU grep e contrassegna i confini delle parole con \b:

grep "\bdeiauk\b" file 

Risultato:

 deiauk 1611516 afsdf 765 

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

Commenti

  • Grazie, ma perché per me non funziona? echo "Enter login: " $vard grep -E "$\bvard\b" file.txt
  • Prova grep "\b${vard}\b" file.txt
  • ancora ' non funziona: /
  • ' avrai bisogno di read: read -p "Enter login: " vard; grep "\b${vard}\b" file.txt

Rispondi

Se il tuo grep supporta -P (PCRE), puoi fare:

$ grep -P "(^|\s)\Kdeiauk(?=\s|$)" file.txt deiauk 1611516 afsdf 765 deiauk 1611516 afsdf ddfgfgd 

Commenti

  • Questa è lunica risposta che funziona con le parole sillabate.
  • Perché \K ( PCRE ripristina linizio della partita) necessario? Questa soluzione proposta sembra funzionare perfettamente senza di essa.

Risposta

A seconda dei dati reali, potresti cerca la parola seguita da uno spazio:

grep "deiauk " file.txt 

Se sai che deve essere allinizio della riga, controllala:

grep "^deiauk " file.txt 

Commenti

  • Purtroppo, tutte le risposte diverse da questa non sono corrette.
  • @Shatu grazie! Quindi, vediamo ' quanto tempo ci vuole per " bolla fino in cima " … Sono ' curioso perché mi piace aggiungere risposte a vecchie domande … Penso che si presume lo sia, ma ne dubito. Sarebbe bello per me, ma in realtà utile per i lettori. Per fare di questo un buon esempio, potrei chiederti di scrivere un commento che riassuma ciò che manca alle altre risposte?
  • (1) Congratulazioni per aver raggiunto 10K rep. Ora hai il privilegio di vedere che questa risposta è stata data prima ed è stata cancellata. (2) È sempre meglio rispondere alla domanda nel modo più ampio possibile, sulla base di ciò che viene detto e non fornire una risposta che funzioni solo per i dati di esempio. Dai dati di esempio nella domanda sembra che le colonne siano separate da spazi, ma non è specificato. Tutte le altre risposte funzioneranno anche per colonne separate da tabulazioni. (3) Hai evitato il difetto fatale nella risposta (eliminata) di tachomi aggiungendo ^ – ma tutte le altre risposte funzionano … (continua)
  • ( Continua) … se la stringa appare in un campo diverso dal primo. (4) Inoltre, tutte le altre risposte funzionano se “deiauk” è lultimo campo (cioè, non cè niente dopo).

Risposta

Ho trovato che -x ha funzionato per me.

Esempio

$ grep -inx -d skip "favicon.ico" * test.txt:1:favicon.ico 

Grep Manual

-x, --line-regexp Select only those matches that exactly match the whole line. For a regular expression pattern, this is like parenthesizing the pattern and then surrounding it with ^ and $. 

Commenti

  • Per 1: 1 corrispondente allintera riga che contiene trattini, -x lunica opzione. Ad esempio grep -w "abc" <<<"abc-hac101-bb0" corrisponderà ma grep -x "abc" <<<"abc-hac101-bb0" non

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *