Como escapar <ou> em um parâmetro no shell?

10

Eu gostaria de usar grepcom uma expressão PCRE que contém o <personagem. Bash acha que quero redirecionar, mas não quero. Como posso escapar <?

hakre
fonte

Respostas:

11

Consegui fazer isso com uma barra invertida:

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

Um citado menos que, e um citado, com barra invertida menos que ambos deram respostas tolas.

Bruce Ediger
fonte
5
Sim, ou coloque-o entre aspas
glenn jackman
Eu ainda preciso aprender, por exemplo, como isso funciona exatamente com escape: grep -oP '(?< )(.*)$'não funciona com aspas simples, por exemplo. Tentei no começo.
hakre
@hakre Parece haver um erro de sintaxe no seu regexp. Você quis dizer (?<! )(.*)$ou (?<= )(.*)$?
Gilles 'SO- stop be evil'
4

Duas regras simples:

  • Uma barra invertida \Cescapa ao próximo caractere, seja ele qual for, exceto uma nova linha.
  • As aspas simples 'text'escapam a qualquer caractere entre elas, incluindo uma barra invertida, mas sem incluir uma única aspas (pois marca o final do texto citado).

Portanto:

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, poderá usar '\''para "escapar" de uma aspas simples dentro de aspas simples. Tecnicamente, o que isso faz é finalizar o primeiro texto literal e, 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 (resumido):

  • Você precisa citar os seguintes caracteres pelo menos algumas das 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 cadeia, a menos que preceda um dos caracteres não literais.

Essas regras são para bash e outras conchas no estilo Bourne (como ash e ksh). Eles também se aplicam ao zsh (exceto que =após o espaço em branco poder ser necessário citar). As regras no csh / tcsh e no Fish são diferentes.

Gilles 'SO- parar de ser mau'
fonte