Jeg har en tekstfil:
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
og I ønsker at matche nøjagtigt deiauk
. Når jeg gør dette:
grep "deiauk" file.txt
får jeg dette resultat:
deiauk 1611516 afsdf 765 deiauk1 sdfsfdsfs 1561 51 deiauk2 115151 5454 4
men jeg behøver kun dette:
deiauk 1611516 afsdf 765 deiauk 1611516 afsdf ddfgfgd
Jeg ved der “sa -w
mulighed, men så skal min streng bearbejde hele linje.
Kommentarer
Svar
Prøv en af:
grep -w "deiauk" textfile grep "\<deiauk\>" textfile
Kommentarer
- Hvis du har et bindestreg ( – ) i slutningen af strengen, dette script vil bringe det som et resultat, hvilket ikke var forventet.
- Korrekt @Eve rt: Ord indeholder kun alfabetegn, cifre og understregninger, så hvis du har forkortelser eller andre bindestreg, fungerer dette ikke.
- @Cyrus Jeg lærte den anden, mens jeg brugte vi / vim
*
kommando på ord. - Det fungerer ikke for noget specielt tegn, det har for eksempel
org.apache.avro avro
betegnet medorg.apache.avro avro+mapred
(prøvet med *) - Brug
-wE
for nøjagtig match af flere ord (boolsk ELLER)
Svar
Prøv dette med GNU grep
og marker ordgrænser med \b
:
grep "\bdeiauk\b" file
Output:
deiauk 1611516 afsdf 765
Se: http://www.regular-expressions.info/wordboundaries.html
Kommentarer
- Tak, men hvorfor fungerer dette ikke for mig?
echo "Enter login: " $vard
grep -E "$\bvard\b" file.txt
- Prøv
grep "\b${vard}\b" file.txt
- fungerer stadig ikke ' t: /
- Du ' skal bruge
read
:read -p "Enter login: " vard; grep "\b${vard}\b" file.txt
Svar
Hvis din grep
understøtter -P
(PCRE), du kan gøre:
$ grep -P "(^|\s)\Kdeiauk(?=\s|$)" file.txt deiauk 1611516 afsdf 765 deiauk 1611516 afsdf ddfgfgd
Kommentarer
- Dette er det eneste svar, der fungerer med orddelte ord.
- Hvorfor er
\K
( PCRE nulstillet start af kamp) nødvendigt? Denne foreslåede løsning ser ud til at fungere fint uden den.
Svar
Afhængigt af dine reelle data kan du kig efter ordet efterfulgt af et mellemrum:
grep "deiauk " file.txt
Hvis du ved, at det skal være i starten af linjen, skal du kontrollere det:
grep "^deiauk " file.txt
Kommentarer
- Desværre er alle svarene bortset fra dette ikke korrekte.
- @Shatu Tak! Så lad ' s se, hvor lang tid det tager, før det " bobler op til toppen " … Jeg ' er nysgerrig, fordi jeg kan lide at tilføje svar på gamle spørgsmål … Jeg tror, det antages, at det gør det, men jeg tvivler på det. Det ville bare være rart for mig, men faktisk nyttigt for læserne. For at gøre dette til et godt eksempel, kan jeg bede dig om at skrive en kommentar, der opsummerer, hvad de andre svar mangler?
- (1) Tillykke med, at du når 10K rep. Du har nu privilegiet at se, at dette svar blev givet før og blev slettet. (2) Det er altid bedre at besvare spørgsmålet så bredt som muligt, baseret på hvad der er sagt, og ikke give et svar, der fungerer kun til eksempeldataene. Af eksemplets data i spørgsmålet ser det ud til, at kolonnerne er adskilt af mellemrum – men det er ikke specificeret. Alle de andre svar fungerer også for faneadskilte kolonner. (3) Du undgik den fatale fejl i tachomis (slettede) svar ved at tilføje
^
– men alle de andre svar fungerer … (Fortsat) - ( Fortsættes) … hvis strengen vises i et andet felt end det første. (4) Alle de andre svar fungerer også, hvis deiauk er det sidste felt (dvs. der er intet efter det).
Svar
Jeg fandt -x
fungerede for mig.
Eksempel
$ 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 $.
Kommentarer
- For 1: 1, der matcher hele linjen, der indeholder bindestreger,
-x
den eneste mulighed. For eksempelgrep -w "abc" <<<"abc-hac101-bb0"
matcher, mengrep -x "abc" <<<"abc-hac101-bb0"
vil ikke
grep -w
? (Denne mulighed er nøjagtigt til det formål , og det virker for mig.) – Bemærk: indstilling-x
matcher hele linjen.deiauk
/ " Jeg har kun brug for dette:deiauk 1611516 afsdf 765
" – hvad har du brug for?