Como posso grep para uma string que começa com um hífen / hífen?

347

Eu quero grep para a string que começa com um hífen / traço, como -Xem um arquivo, mas está confundindo isso como um argumento de linha de comando.

Eu tentei:

grep "-X"
grep \-X
grep '-X'
Mike
fonte

Respostas:

465

Usar:

grep -- -X

Relacionado: O que significa um traço duplo simples? (graças a noz sobre natty ).

newacct
fonte
57
para aqueles de nós perguntando nesta fase o --meio ou faz: unix.stackexchange.com/questions/11376/...
noz sobre natty
2
Também trabalha com o Silver Searcher (ag).
Zev Eisenberg
Se você deseja usar com espaços variáveis tendo você deve usar algo como isto:ARGS="-a -b -c" grep -- "$ARGS"
zapstar
2
@ zapstar Ou apenas grep -- "--name awesome",.
Brett Widmeier
@BrettWidmeier, sim, eu não deveria ter usado a variável, ela confunde as pessoas.
Zapstar
57

O traço é um caractere especial no Bash, conforme observado em http://tldp.org/LDP/abs/html/special-chars.html#DASHREF . Portanto, escapar dessa vez apenas leva você ao Bash, mas o Grep ainda tem seu próprio significado para traços (fornecendo opções).

Então você realmente precisa escapar duas vezes (se preferir não usar as outras respostas mencionadas). O seguinte irá / deve funcionar

grep \\-X
grep '\-X'
grep "\-X"

Uma maneira de testar como o Bash passa argumentos para um script / programa é criar um script .sh que apenas faça eco de todos os argumentos. Eu uso um script chamado echo-args.sh para brincar de vez em quando, tudo o que ele contém é:

echo $*

Eu o invoco como:

bash echo-args.sh \-X
bash echo-args.sh \\-X
bash echo-args.sh "\-X"

Você entendeu a ideia.

Chad Gorshing
fonte
11
Eu não acho - é um personagem especial no Bash, apesar do que o guia do ABS diz. O Bash não processa argumentos que começam com - de maneira diferente dos outros. O comando ou built-in que o Bash chama subseqüentemente manipulará os argumentos que começam com um hífen da maneira que achar melhor. A maioria dos built-ins do Bash e os comandos Linux e GNU tratam - como um terminador opcional. Use 'set -x' para ver os comandos e argumentos que o Bash usa antes de serem executados, mas depois que o Bash expande escapes, globs e chaves. O Grep é um exemplo confuso porque faz seu próprio tratamento de escapes de barra invertida.
Noah Spurrier
25

grep -e -X fará o truque.

Thomas
fonte
11
meu grep não tem -e, muito estranho
Mike
14
solaris para perder
Mike
2
Disponível no solaris em / usr / xpg4 / bin / grep, btw. Muitos utilitários mais completos nesse diretório.
pra
Funcionou no MinGW (o MinGW não suporta -P(mas isso é outra história e não se aplica aqui)).
Peter Mortensen
20
grep -- -X
grep \\-X
grep '\-X'
grep "\-X"
grep -e -X
grep [-]X
John Henry
fonte
7

Eu não tenho acesso a uma máquina Solaris, mas grep "\-X"funciona para mim no linux.

ezpz
fonte
5

A maneira correta seria usar "-" para interromper o processamento de argumentos, como já mencionado. Isso se deve ao uso de getopt_long (função GNU C de getopt.h) na fonte da ferramenta.

É por isso que você percebe o mesmo fenômeno em outras ferramentas de linha de comando; como a maioria delas são ferramentas GNU e usam essa chamada, elas exibem o mesmo comportamento.

Como observação lateral - getopt_long é o que nos dá a escolha legal entre -rlo e --really_long_option e a combinação de argumentos no intérprete.

fmmarques
fonte
3

Se você estiver usando outro utilitário que transmita um único argumento para grep, poderá usar:

'[-]X'
Colin vH
fonte
2

você pode usar nawk

$ nawk '/-X/{print}' file
ghostdog74
fonte
-1
ls -l | grep "^-"

Espero que este sirva ao seu propósito.

XINU
fonte
2
Essa expressão captura apenas as linhas que começam com um traço. Não está de acordo com a pergunta inicial. Ele deseja procurar uma sequência iniciada por um traço, mas as linhas que contêm essa sequência não começam necessariamente com um traço. Na pergunta inicial, a sequência que começa com um traço pode estar em qualquer lugar da linha.
21717 Laurent Simon
-1

arquivo grep "^ -X"

Ele irá grep e escolherá todas as linhas do arquivo. ^ no grep "^" indica uma linha que começa com

sasank
fonte
11
Já existe uma resposta que sugeriu que stackoverflow.com/a/27440348/441757 (publicado mais de um ano atrás)
sideshowbarker
O OP está procurando seqüências de caracteres que começam com -, não linhas.
precisa saber é o seguinte