Jak uciec <lub> w parametrze w powłoce?

10

Chciałbym użyć grepz wyrażeniem PCRE zawierającym <znak. Bash myśli, że chcę przekierować, ale nie chcę. Jak mogę uciec <?

hakre
źródło

Odpowiedzi:

11

Byłem w stanie to zrobić z odwrotnym ukośnikiem:

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

Cytowany mniej niż i cytowany, odwrócony o mniej niż oba, dawał głupie odpowiedzi.

Bruce Ediger
źródło
5
Tak, lub umieść to w pojedynczych cytatach
glenn jackman
Nadal muszę się nauczyć, np. Jak to dokładnie działa z ucieczką: grep -oP '(?< )(.*)$'na przykład nie działa z pojedynczymi cudzysłowami. Najpierw próbowałem.
hakre
@hakre Wygląda na to, że występuje błąd składniowy w wyrażeniu regularnym. Miałeś na myśli (?<! )(.*)$czy (?<= )(.*)$?
Gilles „SO- przestań być zły”
4

Dwie proste zasady:

  • Odwrotny ukośnik \C unika następnego znaku, cokolwiek to jest, innego niż nowy wiersz.
  • Pojedyncze cudzysłowy 'text'unikają znaków między nimi, w tym odwrotnego ukośnika, ale nie zawierają pojedynczego cudzysłowu (ponieważ oznacza on koniec cytowanego tekstu).

A zatem:

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

Jeśli potrzebujesz przekazać argument zawierający pojedyncze cudzysłowy, możesz użyć '\''„do ucieczki” pojedynczego cudzysłowu w pojedynczych cudzysłowach. Technicznie rzecz biorąc, oznacza to zakończenie pierwszego tekstu dosłownego, następnie umieszczenie literału 'w tym samym słowie, a następnie bardziej dosłownego tekstu w tym samym słowie.

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

Pozostałe zasady cytowania (podsumowane):

  • Przynajmniej raz musisz zacytować następujące znaki: białe znaki i !"#$&'()*;<>?[\]^`{|}~(innymi słowy, następujące znaki są bezpieczne: litery, cyfry %+,-./:=@_i znaki spoza ASCII).
  • Pomiędzy podwójnymi cudzysłowami wszystkie znaki są używane dosłownie z wyjątkiem "$\`i (w powłokach z włączoną historią) !. Odwrotny ukośnik między podwójnymi cudzysłowami pojawi się w ciągu, chyba że poprzedza jeden z nieliterowych znaków.

Te zasady dotyczą bash i innych powłok w stylu Bourne'a (takich jak ash i ksh). Odnoszą się one również do zsh (z wyjątkiem tego, że =po spacji może być potrzebne cytowanie). Zasady w csh / tcsh i w Fish są różne.

Gilles „SO- przestań być zły”
źródło