Bezpieczna odpowiedź na krzyżową dystrybucję (w tym Windows MinGW?)
grep -h "[[:alpha:]]*th[[:alpha:]]*" 'filename' | tr ' ' '\n' | grep -h "[[:alpha:]]*th[[:alpha:]]*"
Jeśli używasz starszych wersji grep (takich jak 2.4.2), które nie zawierają opcji -o. Użyj powyższego. W innym przypadku skorzystaj z prostszej wersji, aby zachować wersję poniżej.
Bezpieczna odpowiedź na dystrybucję w systemie Linux
grep -oh "[[:alpha:]]*th[[:alpha:]]*" 'filename'
Aby podsumować -oh
wyniki, wyrażenie regularne pasuje do zawartości pliku (a nie jego nazwy pliku), podobnie jak oczekiwałbyś, że wyrażenie regularne będzie działać w vim / etc ... To, jakie słowo lub wyrażenie regularne będzie wtedy wyszukiwane, zależy od ty! Tak długo, jak pozostajesz w POSIX, a nie w perlowej składni (patrz poniżej)
Więcej z instrukcji grep
-o Print each match, but only the match, not the entire line.
-h Never print filename headers (i.e. filenames) with output lines.
-w The expression is searched for as a word (as if surrounded by
`[[:<:]]' and `[[:>:]]';
Powód, dla którego oryginalna odpowiedź nie działa dla wszystkich
Użycie \w
różni się w zależności od platformy, ponieważ jest to rozszerzona składnia „perl”. W związku z tym instalacje grep, które są ograniczone do pracy z klasami znaków POSIX, [[:alpha:]]
a nie ich odpowiednikiem w perlu \w
. Więcej informacji można znaleźć na stronie Wikipedii dotyczącej wyrażeń regularnych
Ostatecznie powyższa odpowiedź na POSIX będzie dużo bardziej niezawodna niezależnie od platformy (będącej oryginalną) dla grep
Jeśli chodzi o obsługę grep bez opcji -o, pierwszy grep wypisuje odpowiednie linie, tr dzieli spacje na nowe linie, a końcowe filtry grep tylko dla odpowiednich linii.
(PS: Wiem, że do tej pory większość platform zostałaby załatana dla \ w .... ale zawsze są takie, które pozostają w tyle)
Podziękowania za obejście „-o” z odpowiedzi @AdamRosenfield