Mám textový soubor:

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 

a já chcete přesně odpovídat deiauk. Když to udělám:

grep "deiauk" file.txt 

dostanu tento výsledek:

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

ale já stačí jen toto:

deiauk 1611516 afsdf 765 deiauk 1611516 afsdf ddfgfgd 

Vím, že existuje možnost „sa -w, ale můj řetězec musí obrobit celý řádek.

Komentáře

  • Zkoušeli jste skutečně grep -w? (Tato možnost je přesně pro tento účel , a funguje to pro mě.) – Poznámka: volba -x odpovídá celému řádku.
  • " Chci přesně odpovídat deiauk / " Potřebuji pouze toto: deiauk 1611516 afsdf 765 " – které potřebujete?

Odpovědět

Vyzkoušejte jeden z:

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

Komentáře

  • Pokud máte pomlčka () na konci řetězce, kterou tento skript přinese jako výsledek, což se neočekávalo.
  • Opravit @Eve rt: Slova obsahují pouze alfa znaky, číslice a podtržítka, takže pokud máte zkratky nebo jiné položky rozdělené na pomlčky, nefunguje to.
  • @Cyrus Druhou jsem se naučil při používání vi / vim * příkaz pro slova.
  • Nepracuje pro žádný speciální znak, například org.apache.avro avro greped with org.apache.avro avro+mapred (vyzkoušeno s *)
  • Přesné použití -wE shoda více slov (logická OR)

odpověď

Zkuste to s GNU grep a hranice slov označte \b:

grep "\bdeiauk\b" file 

Výstup:

 deiauk 1611516 afsdf 765 

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

Komentáře

  • Díky, ale proč mi to nefunguje? echo "Enter login: " $vard grep -E "$\bvard\b" file.txt
  • Vyzkoušejte grep "\b${vard}\b" file.txt
  • stále ' nefunguje: /
  • ' budete read: read -p "Enter login: " vard; grep "\b${vard}\b" file.txt

odpověď

Pokud vaše grep podporuje -P (PCRE), můžete to udělat:

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

Komentáře

  • Toto je jediná odpověď, která funguje s pomlčkami.
  • Proč je \K ( PCRE reset začátek zápasu) potřeba? Zdá se, že toto navrhované řešení funguje dobře.

Odpověď

V závislosti na vašich skutečných datech můžete vyhledejte slovo následované mezerou:

grep "deiauk " file.txt 

Pokud víte, že musí být na začátku řádku, zkontrolujte jej:

grep "^deiauk " file.txt 

Komentáře

  • Všechny tyto odpovědi jsou bohužel nesprávné.
  • @Shatu Díky! Nechme tedy ' s zjistit, jak dlouho trvá " probublávat se nahoru " … jsem ' jsem zvědavý, protože rád přidávám odpovědi na staré otázky … Myslím, že se to předpokládá, ale pochybuji. Bylo by to pro mě hezké, ale skutečně užitečné pro čtenáře. Aby to byl dobrý příklad, mohl bych vás požádat, abyste napsali komentář shrnující, co chybí ostatním odpovědím?
  • (1) Gratuluji k dosažení 10 tis. Rep. Nyní máte oprávnění vidět, že tato odpověď byla dána dříve a byla odstraněna. (2) Vždy je lepší odpovědět na otázku co nejširší, na základě toho, co se říká, a neposkytovat odpověď, která funguje pouze pro ukázková data. Z ukázkových dat v otázce se zdá, že sloupce jsou odděleny mezerami – ale to není uvedeno. Všechny ostatní odpovědi budou fungovat také pro sloupce oddělené tabulátory. (3) Vyvarovali jste se fatální chyby v (odstraněné) odpovědi tachomi přidáním ^ – ale všechny ostatní odpovědi fungují … (pokračování)
  • ( Contd)… pokud se řetězec objeví v jiném poli než v prvním. (4) Všechny ostatní odpovědi také fungují, pokud je posledním polem „deiauk“ (tj. Po něm už nic není).

Odpověď

Zjistil jsem, že -x pro mě pracoval.

Příklad

$ 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 $. 

Komentáře

  • Pro poměr 1: 1 celý řádek, který obsahuje pomlčky, -x jediná možnost. Například grep -w "abc" <<<"abc-hac101-bb0" bude odpovídat, ale grep -x "abc" <<<"abc-hac101-bb0" nebude

Napsat komentář

Vaše e-mailová adresa nebude zveřejněna. Vyžadované informace jsou označeny *