Odpowiedzi:
Jeśli szukasz wystąpienia 3 kolejnych znaków „T” w pliku, możesz to zrobić za pomocą grep. Czego próbowałeś, co nie zadziałało? I, jeśli chcesz tylko sprawdzić pierwszych 2000 linie pliku, można rura wyjście głowicy polecenia do grep. Na przykład, head -n 2000 somefile.txt | grep "TTT"jeśli chcesz uzyskać liczbę wierszy w pliku zawierającym „TTT”, możesz użyć:
head -n 2000 somefile.txt | grep -c "TTT"
Jeśli niektóre linie mogą mieć wiele wystąpień i chcesz policzyć wszystkie wystąpienia, a nie tylko liczbę wierszy zawierających „TTT”, użyj -oopcji grep , która wyświetli każde wystąpienie w osobnej linii, a następnie potokuje wyjście do wc polecenie, które wyświetli liczbę wszystkich wystąpień „TTT” w pierwszych 2000 wierszach pliku:
head -n 2000 somefile.txt | grep -o "TTT" | wc -l
Zwykle wyszukiwanie TTT(3 T) w TTTTTT(6 T) daje tylko 2 dopasowania, ponieważ wyszukiwanie następnego dopasowania odbywa się zaraz po znalezieniu poprzedniego dopasowania.
Spróbuję zilustrować:
TTTTTT
^ set starting position
TTTTTT
‾‾‾ found a match for TTT
TTTTTT
‾‾‾^ set next starting position
TTTTTT
‾‾‾ found a match for TTT
TTTTTT
^ end of stream
Jeśli chcesz rozważyć TTTTTTcztery instancje TTT, sugeruję, abyś dopasował tylko jedną postać, a następnie użyj lookaround, aby ukończyć pasujący wzór.
W swoim rozwiązaniu użyję lookahead:
head -2000 file | /usr/gnu/bin/grep -P -o 'T(?=TT)' | wc -l
Objaśnienia do grepczęści:
grepwyrażenia regularnego Perla, aby użyć lookahead; w moim systemie muszę to określić/usr/gnu/bin/grep-P aktywować tryb wyrażeń regularnych Perla-oaby wyświetlić każde wystąpienie w osobnej linii, aby umożliwić wc -lpoliczenie każdego dopasowania'T(?=TT)'jest wyrażeniem regularnym do dopasowania, po Tktórym następuje TT(za pomocą lookahead); Po znalezieniu dopasowania silnik wyrażeń regularnych rozpocznie się od drugiej, T aby spróbować znaleźć następne dopasowanie, umożliwiając, aby ta sekunda T była częścią następnego dopasowania, jeśli jest zgodna ze wzorcem.Używając przykładowego ciągu z komentarza:
i przetwarzanie go za pomocą powyższego wyrażenia regularnego:
echo 'JKHFSDTTTJSDJHTTTTTKSJTIITTT' | /usr/gnu/bin/grep -P --color=always 'T(?=TT)'
będzie produkować:
co znaczy:
Ilustracja:
JKHFSDTTTJSDJHTTTTTKSJTIITTT
^ set starting position
JKHFSDTTTJSDJHTTTTTKSJTIITTT
‾^ found a match for T(?=TT) & set next starting position
JKHFSDTTTJSDJHTTTTTKSJTIITTT
‾^ found a match for T(?=TT) & set next starting position
JKHFSDTTTJSDJHTTTTTKSJTIITTT
‾^ found a match for T(?=TT) & set next starting position
JKHFSDTTTJSDJHTTTTTKSJTIITTT
‾^ found a match for T(?=TT) & set next starting position
JKHFSDTTTJSDJHTTTTTKSJTIITTT
‾^ found a match for T(?=TT) & set next starting position
JKHFSDTTTJSDJHTTTTTKSJTIITTT
^ end of stream