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'

Respostas:


465

Usar:

grep -- -X

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


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.


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.


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

7

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


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.


3

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

'[-]X'


-1
ls -l | grep "^-"

Espero que este sirva ao seu propósito.


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

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.