Comment échapper <ou> dans un paramètre en shell?

10

Je voudrais utiliser grepune expression PCRE contenant le <caractère. Bash pense que je veux rediriger, mais je ne veux pas. Comment puis-je m'échapper <?

hakre
la source

Réponses:

11

J'ai pu le faire avec une barre oblique inverse:

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

Une citation inférieure à, et une citation, moins inversée que les deux ont donné des réponses maladroites.

Bruce Ediger
la source
5
Oui, ou mettez-le entre guillemets simples
Glenn Jackman
J'ai encore besoin d'apprendre, par exemple, comment cela fonctionne exactement avec l'échappement: grep -oP '(?< )(.*)$'ne fonctionne pas avec des guillemets simples par exemple. J'ai essayé au début.
hakre
@hakre Il semble y avoir une erreur de syntaxe dans votre expression rationnelle. Voulez-vous dire (?<! )(.*)$ou (?<= )(.*)$?
Gilles 'SO- arrête d'être méchant'
4

Deux règles simples:

  • Une barre oblique inversée \Céchappe au personnage suivant, quel qu'il soit, autre qu'une nouvelle ligne.
  • Les guillemets simples 'text'échappent à tout caractère entre eux, y compris une barre oblique inverse, mais sans inclure de guillemet simple (car il marque la fin du texte cité).

Donc:

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

Si vous devez passer un argument contenant des guillemets simples, vous pouvez utiliser '\''pour «échapper» un guillemet simple à l'intérieur de guillemets simples. Techniquement, cela finit par mettre fin au premier texte littéral, puis à mettre un littéral 'dans le même mot, puis un texte plus littéral toujours dans le même mot.

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

Le reste des règles de cotation (résumées):

  • Vous devez citer les caractères suivants au moins quelques fois: les espaces et !"#$&'()*;<>?[\]^`{|}~(en d'autres termes, les caractères suivants sont sûrs: lettres, chiffres %+,-./:=@_et caractères non ASCII).
  • Entre les guillemets doubles, tous les caractères sont utilisés littéralement sauf "$\`et (dans les shells avec l'historique activé) !. Une barre oblique inverse entre guillemets doubles apparaîtra dans la chaîne, sauf si elle précède l'un des caractères non littéraux.

Ces règles s'appliquent aux bash et autres shells de style Bourne (tels que ash et ksh). Ils s'appliquent également à zsh (sauf =qu'après les espaces, il peut être nécessaire de les citer). Les règles dans csh / tcsh et dans Fish sont différentes.

Gilles 'SO- arrête d'être méchant'
la source