Zasadniczo, które znaki w wyrażeniu regularnym wymagają ucieczki?
Na przykład następujące informacje nie są poprawne pod względem składniowym:
echo '[]' | grep '[]'
grep: Unmatched [ or [^
To jednak jest syntatically poprawne:
echo '[]' | grep '\[]'
[]
Czy istnieje dokumentacja, na których znakach należy wstawiać znaki regularne, a które nie?
źródło
bash
zestawie)!
nadal jest rozwijany w podwójnych cudzysłowach, tylko pojedyncze cudzysłowy zatrzymają jego rozwinięcie (lub wyłączenie opcji powłoki).]
nie należy cytować,[
nie zawsze. Nie mogę znaleźć żadnego odniesienia do{
i}
Istnieje wiele rodzajów wyrażeń regularnych, a zestaw znaków specjalnych zależy od konkretnego typu. Niektóre z nich opisano poniżej. We wszystkich przypadkach znaki specjalne są poprzedzane odwrotnym ukośnikiem
\
. Np. Aby dopasować[
, napisz\[
zamiast tego. Alternatywnie znaki (z wyjątkiem^
) można uciec, zamykając je między nawiasami kwadratowymi jeden po drugim, podobnie[[]
.Znaki, które są specjalne w niektórych kontekstach, takie jak
^
specjalne na początku (pod-) wyrażenia, mogą być poprzedzane znakami ucieczki we wszystkich kontekstach.Jak napisali inni: w powłoce, jeśli nie umieścisz wyrażenia między pojedynczymi cudzysłowami, musisz dodatkowo uciec od znaków specjalnych dla powłoki w już zmienionym wyrażeniu regularnym. Przykład: Zamiast tego
'\['
możesz pisać\\[
(alternatywnie:"\["
lub"\\["
) w kompatybilnych powłokach Bourne'a, takich jak bash, ale to już inna historia.Podstawowe wyrażenia regularne (BRE)
grep
,sed
.[\
*^$
"$(printf '%s' "$string" | sed 's/[.[\*^$]/\\&/g')"
Rozszerzone wyrażenia regularne (ERE)
grep -E
GNUsed -r
:, * BSD:sed -E
.[\(
*^$)+?{|
"$(printf '%s' "$string" | sed 's/[.[\*^$()+?{|]/\\&/g')"
źródło
grep
używa BRE jako metody wyrażenia regularnego. Jest dobra dokumentacja na nim tutaj , ogólne wybiegiem byłoby „uciec dowolny znak specjalny lub metaznaku uzyskać dosłownym, ucieczka tworzyć sekwencje (\n
,\r
itp)”, choć nie zawsze jest to prawda, na przykład, trzeba uciec(
i)
uzyskać ich specjalne znaczenie (odniesienie wsteczne).źródło
Powłoka może przekształcić wiersz poleceń przed wykonaniem polecenia. Zarówno powłoka, jak i
grep
może używać cudzysłowu, aby usunąć specjalne znaczenie niektórych znaków. Niemniej jednakgrep
pociski mają różne znaki specjalne. Co więcej, znaki specjalne nieskalowane, które nie powstały z istniejącego rozszerzenia, są usuwane przed wykonaniem polecenia przez powłokę.Powłoka przesyła argument
[]
dogrep
i jest analizowana jako zniekształcone wyrażenie nawiasowe przezgrep
.Powyżej widzimy podobny przypadek. Odwrotny ukośnik jest usuwany i
[]
przesyłany jako argument dogrep
.grep
rozpoznaje zniekształcone wyrażenie w nawiasie.Wreszcie w tym przypadku cudzysłowy są usuwane przez powłokę i
\[]
przekazywane jako argument do,grep
ale w tym konkretnym przypadku ¹\[
jest interpretowanegrep
jako dosłowny nawias. Aby zapobiec interpretacji ukośnika odwrotnego jako powłoki specjalnej, potrzebne są cudzysłowy.¹ Specyfikacja POSIX .
źródło