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 é:
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.
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.
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
--
meio ou faz: unix.stackexchange.com/questions/11376/...ARGS="-a -b -c"
grep -- "$ARGS"
grep -- "--name awesome"
,.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
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 é:
Eu o invoco como:
Você entendeu a ideia.
fonte
grep -e -X
fará o truque.fonte
-P
(mas isso é outra história e não se aplica aqui)).grep -e '--cut here--' *
procura por todas as linhas correspondentes‘--cut here--’
. Sem -e, o grep tentaria analisar‘--cut here--’
como uma lista de opções.fonte
Eu não tenho acesso a uma máquina Solaris, mas
grep "\-X"
funciona para mim no linux.fonte
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.
fonte
Se você estiver usando outro utilitário que transmita um único argumento para grep, poderá usar:
fonte
você pode usar nawk
fonte
Espero que este sirva ao seu propósito.
fonte
arquivo grep "^ -X"
Ele irá grep e escolherá todas as linhas do arquivo. ^ no grep "^" indica uma linha que começa com
fonte
-
, não linhas.