Skrypt Bash z grep -w

2

Używam następującego polecenia: x.txt | grep -w 'in' i otrzymuję odpowiedzi takie jak: in into ... itd.

Chcę tylko odpowiedzi: w

Jak powinienem zmodyfikować polecenie?

NewBo
źródło
Powinieneś przeformułować swoje pierwotne pytanie, aby określić, że problem dotyczy konkretnych znaków UTF-8. Spójrz również na „EDIT4” w mojej odpowiedzi poniżej, gdzie używam seddo obejścia problemu.
Daniel Andersson

Odpowiedzi:

2

Po pierwsze, polecenie powinno być

grep -w in x.txt

Twój bieżący potok nie działa i zbędne jest cattworzenie pliku w potoku. grepmoże czytać pliki bezpośrednio.

Po drugie, -wrobi dokładnie to, co chcesz. Ze strony podręcznika:

-w, --word-regexp

Wybierz tylko te wiersze zawierające dopasowania, które tworzą całe słowa. Test polega na tym, że pasujące podciągi muszą znajdować się na początku wiersza lub poprzedzone znakiem składającym się z innych słów. Podobnie musi znajdować się na końcu wiersza lub musi zawierać znak nie będący składnikiem. Znaki składające się na słowo to litery, cyfry i znak podkreślenia.

grepzwróci pełne wiersze, w których występuje słowo; taka jest funkcja grep; Wspominam o tym, aby sprawdzić, czy przez to się nie pomylisz.

Jeśli chcesz tylko zwrócić słowo, tak jak mówisz, możesz to zrobić

grep -ow in x.txt

ponieważ -ozwraca tylko pasującą część, ale wydaje się to dość bezowocne. Co naprawdę próbujesz zrobić?


EDYCJA: wyraźny przykład:

$ cat test
word in word
within word
word word
$ grep -w in test
word in word

„w” nie pasuje.

EDYCJA 2: Kolejny przykład:

$ grep '\<in\>' test 
word in word

EDYCJA 3: Podano, że problem dotyczy szwedzkich znaków. Mogę to odtworzyć, nawet jeśli zmienna środowiskowa jest LANGustawiona na sv_SE.UTF-8. https://stackoverflow.com/questions/9260293/egrep-accented-characters-not-recognised-as-part-of-a-word sugeruje użycie Perla dla określonych zadań UTF-8 jako najprostszego rozwiązania.


EDIT4: Wydaje się, że mogę użyć sedtej pracy ze szwedzkimi postaciami:

$ cat test
word den word
avträden word
word word
$ sed -n '/\bden\b/p' test
word den word
$ sed -n '/\<den\>/p' test
word den word

Jest to pragmatyczne rozwiązanie, ale mam nadzieję, że zadziała do tego zadania.

Daniel Andersson
źródło
Chodziło mi o to, że chcę tylko linii, w której występuje całe słowo, tj. Linii, w której występuje „in”, ale nie linii, w której występuje „wewnątrz”.
NewBo
2
Tak, ale właśnie to -wdziała. Czy to nie dziala Podaj wyraźny przykład, w którym to nie działa. Zrobiłem teraz przypadek testowy i wszystko, co mogę powiedzieć, działa tak, jak chcesz.
Daniel Andersson
grep -w "den" ./sv_enb.txt daje wynik den; it avträden; privies (używam OSX)
NewBo
OSX może równie dobrze być odpowiedni. Czy przeglądałeś instrukcję obsługi grepswojego systemu? Jest -wopisany? W przeciwnym razie, można wymieniać -w inna '\<in\>', jak starałem się opisać w obecnie usunięty odpowiedź. Może to być także dziwny błąd Unicode w OSX, ale najpierw wypróbuj powyższe.
Daniel Andersson
grep "\ <den \>" ./sv_enb.txt daje den; it avträden; privies. Kiedy czytam strony podręcznika są one takie same jak inne strony podręcznika dla grep, brak specjalnych informacji o poleceniu w OSX (lub OpenBSD).
NewBo