Usuwam słowa stop z tekstu, z grubsza używając tego kodu
Mam następujące
$ cat file
file
types
extensions
$ cat stopwords
i
file
types
grep -vwFf stopwords file
Oczekuję wyniku:
extensions
ale dostaję (myślę, że niepoprawny)
file
extensions
To tak, jakby słowo file
zostało pominięte w pliku stopwords. Teraz tutaj jest nieco cool: gdybym zmodyfikować plik odrzucanych słów, zmieniając jedno słowo / literę i
na pierwszej linii, do jakiegokolwiek innego ASCII litery oprócz f
, i
, l
, e
, a następnie to samo polecenie grep daje mi inny i prawidłowego wyniku extensions
.
Co tu się dzieje i jak to naprawić?
Używam grep (BSD grep) 2.5.1-FreeBSD na bash dla systemu Mac OSX GNU, wersja 4.4.12 (1)
-x
przełącznika do wyrażenia regularnego wiersza zamiast-w
słowa? Myślę jednak, że-F
zmiana anuluje którekolwiek z nich lub odwrotnie.i
wzorca na drugi zamiast pierwszego wzorca wstopwords
pliku również zmienia zachowanie.grep
ani z GNUgrep
3.1.Odpowiedzi:
Był to błąd
bsdgrep
związany ze zmienną, która śledzi część bieżącego wiersza do skanowania, która jest zastępowana kolejnymi wywołaniami do silnika dopasowywania wyrażeń regularnych, gdy w grę wchodzi wiele wzorców.lokalna poprawka
Można obejść ten problem w pewnym stopniu, nie używając
-w
opcji, która opiera się na tej zmiennej do poprawnego działania, a zatem nie działa, ale zamiast tego używa rozszerzeń wyrażeń regularnych, które pasują do początku i końca słów, dzięki czemustopwords
plik wygląda jak:To obejście wymaga również, aby nie używać tej
-F
opcji.Należy zauważyć, że udokumentowane regularne elementy ekspresyjne
[[:<:]]
i[[:>:]]
żere_format
instrukcja mówi pan o będzie nie działa tutaj. Wynika to z faktu, że skompilowana biblioteka wyrażeń regularnychbsdgrep
ma włączoną obsługę kompatybilności wyrażeń regularnych GNU. To kolejny błąd, który podobno został naprawiony.poprawka serwisowa
Ten błąd został naprawiony na początku tego roku. Ta poprawka nie została jeszcze wprowadzona do wersji STABILNEJ lub WYDAWNEJ FreeBSD, ale podobno jest w BIEŻĄCEJ.
Aby pobrać to do wersji MacOS
grep
, która pochodzi z FreeBSDbsdgrep
, skonsultuj się z Apple. ☺Dalsza lektura
źródło
Ten kod:
produkuje:
W systemie takim jak:
Więcej szczegółów na temat cgrep, dostępnych poprzez brew oraz z sourceforge:
na zdrowie, drl
źródło