Estou removendo palavras de parada de um texto, usando aproximadamente este código
Eu tenho o seguinte
$ cat file
file
types
extensions
$ cat stopwords
i
file
types
grep -vwFf stopwords file
Estou esperando o resultado:
extensions
mas recebo o (acho incorreto)
file
extensions
É como se a palavra file
tivesse sido ignorada no arquivo de palavras irrelevantes. Agora aqui é a parte legal: se eu modificar o arquivo de stopwords, mudando a palavra / única letra i
na primeira linha, para qualquer outra letra ascii para além de f
, i
, l
, e
, em seguida, o mesmo comando grep me dá um resultado diferente e correcta extensions
.
O que está acontecendo aqui e como corrigi-lo?
Estou usando o grep (BSD grep) 2.5.1-FreeBSD em um Mac OSX GNU bash, versão 4.4.12 (1)
-x
opção para regex de linha em vez de-w
para word? No entanto, acho que a-F
opção cancelará qualquer um deles ou vice-versa.i
padrão o segundo e não o primeiro padrão nostopwords
arquivo também altera o comportamento.grep
nem com o GNUgrep
3.1.Respostas:
Isso foi um problema
bsdgrep
, relacionado a uma variável que rastreia a parte da linha atual ainda a ser varrida e substituída por chamadas sucessivas ao mecanismo de correspondência de expressões regulares quando vários padrões estão envolvidos.correção local
Você pode contornar isso até certo ponto, não usando a
-w
opção, que depende dessa variável para a operação correta e, portanto, está falhando, mas usando as extensões de expressão regular que correspondem ao início e ao final das palavras, fazendo com que seustopwords
arquivo se pareça com:Esta solução alternativa também exigirá que você não use a
-F
opçãoObserve que os componentes de expressão regular documentados
[[:<:]]
e[[:>:]]
que ore_format
manual informa não funcionarão aqui. Isso ocorre porque a biblioteca de expressões regulares compiladabsdgrep
tem o suporte à compatibilidade de expressões regulares GNU ativado. Este é outro bug, que foi consertado.correção de serviço
Este bug foi corrigido no início deste ano. A correção ainda não chegou aos sabores STABLE ou RELEASE do FreeBSD, mas está em ATUALIZAÇÃO.
Para colocar isso na versão MacOS
grep
derivada do FreeBSDbsdgrep
, consulte a Apple. ☺Leitura adicional
fonte
Este código:
produz:
Em um sistema como:
Mais detalhes sobre o cgrep, disponível via brew e no sourceforge:
Saúde, drl
fonte