Come sfuggire a <o> in un parametro nella shell?


10

Mi piacerebbe usare grepcon un'espressione PCRE che contiene il <personaggio. Bash pensa che io voglia reindirizzare, ma non voglio. Come posso scappare <?

Risposte:


11

Sono stato in grado di farlo con una barra rovesciata:

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

Un citato meno di, e un citato, rovesciato meno di entrambi hanno dato risposte sciocche.


5
Sì, o mettilo tra virgolette singole
glenn jackman,

Devo ancora imparare, ad esempio come funziona esattamente con l'escaping: grep -oP '(?< )(.*)$'ad esempio non funziona con virgolette singole. L'ho provato all'inizio.
Hakre,

@hakre Sembra esserci un errore di sintassi nel tuo regexp. Intendevi (?<! )(.*)$o (?<= )(.*)$?
Gilles 'SO- smetti di essere malvagio' il

4

Due semplici regole:

  • Una barra rovesciata \Csfugge al personaggio successivo, qualunque esso sia, diverso da una nuova riga.
  • Le virgolette singole 'text'sfuggono a qualsiasi carattere tra loro, inclusa una barra rovesciata, ma non includono una virgoletta singola (poiché segna la fine del testo tra virgolette).

Così:

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

Se è necessario passare un argomento che contiene virgolette singole, è possibile utilizzare '\''per "sfuggire" a una virgoletta singola all'interno di virgolette singole. Tecnicamente, ciò che fa è terminare il primo testo letterale, quindi inserire un letterale 'nella stessa parola, quindi più testo letterale sempre nella stessa parola.

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

Il resto delle regole di quotazione (riepilogate):

  • Devi citare almeno alcuni dei seguenti caratteri: spazi bianchi e !"#$&'()*;<>?[\]^`{|}~(in altre parole, i seguenti caratteri sono sicuri: lettere, cifre %+,-./:=@_e caratteri non ASCII).
  • Tra virgolette doppie, tutti i caratteri vengono usati letteralmente tranne "$\`e (nelle shell con la cronologia abilitata) !. Una stringa tra parentesi doppie apparirà nella stringa a meno che non preceda uno dei caratteri non letterali.

Queste regole sono per bash e altre shell in stile Bourne (come ash e ksh). Si applicano anche a zsh (tranne per il fatto che =dopo gli spazi bianchi potrebbe essere necessario un preventivo). Le regole in csh / tcsh e in Fish sono diverse.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.