O conteúdo do arquivo testing.txt é:
ls -a
cmake --verbose
verbose
Eu quero usar grep
para examinar este arquivo e encontrar apenas a palavra que começa com "--", ou seja, a palavra "--verbose"
No entanto, usar os seguintes padrões como argumento para grep
não funciona:
$ cat testing.txt | grep --
Usage: grep [OPTION]... PATTERN
[FILE]... Try 'grep --help' for more information.
$ cat testing.txt | grep -
ls -a
cmake --verbose
$ cat testing.txt | grep '--v'
grep (GNU grep) 3.1
Copyright (C) 2017 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>.
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.
Written by Mike Haertel and others, see <http://git.sv.gnu.org/cgit/grep.git/tree/AUTHORS>.
$ cat testing.txt | grep ver
cmake --verbose
verbose
$ cat testing.txt | grep '-ver'
ls -a
grep
pensa que todos os argumentos que começam com a--
são opções? Como você evita isso para que o grep possa procurar um padrão (em um arquivo) que comece com "--"?- a última tentativa usa o padrão "-ver" para que
grep
não pense que o padrão é uma opção, masgrep
não corresponde à palavra "--verbose" no arquivo mesmo que contenha o padrão "-ver". O que causa esse comportamento?
A string
--
é especial para a maioria dos utilitários quando ocorre na linha de comando. Ele sinaliza o fim das opções para o analisador de argumentos da linha de comando. É usado em situações em que você pode querer passar um nome de arquivo que comece com um traço, como emrm -- -f
(para excluir um arquivo chamado-f
no diretório atual).Para usar
--
como padrão comgrep
, informe explicitamente ao utilitário que é um padrão:A
-e
opção paragrep
recebe um argumento de opção que é o padrão com o qual você desejagrep
pesquisar.Você também poderia usar
Aqui,
grep
sabe que o segundo--
é o padrão, pois o primeiro--
diz que não pode ser uma opção.Seu último pipeline retorna
ls -a
porque é uma linha no arquivo que não inclui um arquivor
. O comandogrep -ver
também pode ser escritogrep -v -e r
, ou seja, "extrair todas as linhas que não (-v
) correspondem ar
(-e r
)".Para responder à pergunta no título que interpreto como significando: informe as palavras delimitadas por espaços em branco que não começam com um alfanumérico ou sublinhado (o
\w
em alguns mecanismos regexp), você pode fazer com o GNUgrep
, desde que seja construído com suporte a PCRE:Esse é um caractere diferente de (
^
) que não seja uma palavra um (\w
) ou um espaço em branco um (\s
) desde que não seja precedido ((?<!...)
) por um não-espaço em branco (\S
) e seguido por qualquer número (*
) de um não-espaço em branco (\S
).Que na sua entrada retorna:
Com
GNU grep
você uma abordagem deste problema por meio depositive lookarounds
como mostrado:Para ser lido como, de onde estou na string, vejo uma não-palavra seguir uma palavra. Mas, essa não-palavra exclui qualquer espaço em branco.
Resultado: