Como escapar ou em um parâmetro no shell?

10

Gostaria de usar grep com uma expressão PCRE que contenha o caractere < . Bash acha que eu quero redirecionar, mas não quero. Como posso escapar de < ?

    
por hakre 26.07.2011 / 02:41

2 respostas

11

Eu consegui fazer isso com uma barra invertida:

25 % grep \< xmospos.c
#include        <stdio.h>
#include        <stdlib.h>
#include        <getopt.h>
#include        <X11/Xlib.h>

Uma citação menor que uma citação invertida, menos do que ambas, forneceu respostas engraçadas.

    
por 26.07.2011 / 03:16
4

Duas regras simples:

  • Uma barra invertida \C escapa do próximo caractere, qualquer que seja, além de uma nova linha.
  • Aspas simples 'text' escapam de qualquer caractere entre elas, incluindo uma barra invertida, mas não incluindo uma aspa simples (já que marca o final do texto entre aspas).

Assim:

grep -P '<html>' myfile
grep -P \<html\> myfile
grep -P '(?<!<)html' myfile
grep -P \(\?\<\!\<\) myfile

Se você precisar passar um argumento que contenha aspas simples, use '\'' para "escapar" uma aspa simples entre aspas simples. Tecnicamente, o que isso faz é terminar o primeiro texto literal, em seguida, colocar um literal ' na mesma palavra, depois mais texto literal ainda na mesma palavra.

grep '^D'\''oh!' myfile

O restante das regras de cotação (resumidas):

  • É preciso citar os seguintes caracteres pelo menos algumas vezes: espaço em branco e !"#$&'()*;<>?[\]^'{|}~ (em outras palavras, os seguintes caracteres são seguros: letras, dígitos, %+,-./:=@_ e caracteres não-ASCII).
  • Entre aspas duplas, todos os caracteres são usados literalmente, exceto "$\' e (em shells com histórico ativado) ! . Uma barra invertida entre aspas duplas aparecerá na string, a menos que preceda um dos caracteres não literais.

Essas regras são para bash e outras shells no estilo Bourne (como ash e ksh). Eles se aplicam também ao zsh (exceto que = após o espaço em branco pode precisar de citação). As regras em csh / tcsh e em Fish são diferentes.

    
por 27.07.2011 / 00:17