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
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 withorg.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říkladgrep -w "abc" <<<"abc-hac101-bb0"
bude odpovídat, alegrep -x "abc" <<<"abc-hac101-bb0"
nebude
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.deiauk
/ " Potřebuji pouze toto:deiauk 1611516 afsdf 765
" – které potřebujete?