De acordo com as Leis 12.965/2014 e 13.709/2018, que regulam o uso da Internet e o tratamento de dados pessoais no Brasil, ao me inscrever na newsletter do portal DICAS-L, autorizo o envio de notificações por e-mail ou outros meios e declaro estar ciente e concordar com seus Termos de Uso e Política de Privacidade.


Busca com grep com padrão iniciado por hífen

Colaboração: Julio Cezar Neves

Data de Publicação: 6 de maio de 2021

Numa lista de discussão sobre Shell, foi colocada a seguinte pergunta:

  • Se quiser usar o grep pra procurar um padrão iniciado por hífen (-), eu vou ter que escapá-lo para o grep não tentar lê-lo como uma opção e retornar erro?

    As respostas de Julio Neves e Paulo Roberto Bagatini geraram o artigo a seguir:

    Muitos comandos utilizam uma biblioteca chamada getopts para parsear sua lista de parâmetros. Existe inclusive um comando built-in do Bash chamado getopts (veja com help getopts) que permite estruturar parâmetros para os scripts.

    Essa biblioteca interpreta dois hifens (--) como um indicador de que, após eles, não serão mais interpretados parâmetros curtos (iniciados por -) ou longos (iniciados por --), apenas parâmetros posicionais.

    Assim, sempre que você precisar entrar com parâmetros posicionais iniciados com hífen em algum comando que utilize essa biblioteca (a maioria dos comandos comuns), você pode fazer, por exemplo:

    Só para relembrar:

  • Um hífen (-) solto sempre se refere a dados da std(in|out);
  • Dois hifens (--) marcam o final das opções

Exemplo com um hífen:

$ cat arq1
preço
primo
prova

$ cat arq2
encher
mário
motor

$ cut -c-3 arq1 | paste -d "" - arq2
preencher
primário
promotor

Exemplo usando dois hifens:

$ > -TRACO  # Forma correta de criar um arquivo chamado -TRACO
$ rm -TRACO
rm: opção -- 'T' inválida
Tente 'rm ./-TRACO' para remover o arquivo '-TRACO'.
Try 'rm --help' for more information.

$ rm -i -- -TRACO
rm: remover arquivo comum vazio '-TRACO'? y

$ ls -*    # Só para mostrar que -TRACO dançou...
ls: opção -- '*' inválida
Try 'ls --help' for more information.

Então, voltando à pergunta inicial: "Se quiser usar o grep pra procurar um padrão iniciado por hífen (-), eu vou ter que escapá-lo para o grep não tentar lê-lo como uma opção e retornar erro?", a resposta é: não adianta nada escapar, pois caractere escapado é para o Bash não interpretar e ele não tem nada a ver com isso. Assim como você viu no exemplo do rm, o erro é gerado pelo grep.

Adicionar comentário

* Campos obrigatórios
5000
Powered by Commentics

Comentários

Nenhum comentário ainda. Seja o primeiro!


Veja a relação completa dos artigos de Julio Cezar Neves