Dopasowywanie znaków specjalnych do wyrażeń regularnych

10

Powiedz, że to bardzo łatwe, jeśli chcę znaleźć coś zawierającego małe litery i cyfry

produce_text | grep -E '[0-9a-z]'

Wsporniki są przydatne do dopasowania zestawu znaków, ale co z tymi, które są nieco wyjątkowe?
Jeśli chcę, za pomocą wsporników, dopasować dowolną postać , ale jeden z nich: nawias zamykający ], myślnik (myślnik) lub „-”, zarówno ukośniki /i \, do daszka ^, dwukropka :.
Czy będzie to wyglądać tak (wiem, że to nie działa)?

[^] - / \ ^:]
iBug
źródło

Odpowiedzi:

11

Aby dopasować literał ]do literału -w wyrażeniu nawiasowym , musisz użyć ich w następujący sposób:

[^]/\^:-]

lub nawet lepiej, ponieważ niektóre narzędzia wymagają odwrotnego ukośnika :

[^]/\\^:-]

to znaczy
nawias kwadratowy z prawej („]”) traci swoje specjalne znaczenie i reprezentuje się w wyrażeniu nawiasowym, jeśli występuje najpierw na liście (po początkowym „^”, jeśli występuje),
a
znak łącznika minus być traktowane jako samo, jeśli występuje najpierw (po początkowym „^”, jeśli istnieje) lub ostatnie na liście,
stąd
jeśli wyrażenie w nawiasie określa zarówno „-”, jak i]], „]” należy umieścić na pierwszym miejscu (po „^”, jeśli istnieje) i „-” są ostatnie w wyrażeniu nawiasowym.
Reguły dla wyrażeń w nawiasach są takie same dla ERE i BRE .

don_crissti
źródło
2
Podwoiłbym odwrotny ukośnik, aby być po bezpiecznej stronie. Jest potrzebny na przykład w wielu awkimplementacjach perl.
Stéphane Chazelas,
A co z „Od karetki do klamry zamykającej”? Jak [^-]](ten zawodzi)?
iBug
2
@iBug - na pewno zawiedzie, ponieważ prawy nawias musi być pierwszy, jeśli chcesz go dosłownie dopasować. Nie jestem pewien, o co chodzi z tym „zasięgu”, które można wymienić, jak ^jest po ]więc [^-]]nie będzie działać nawet wtedy, gdy oba ^i ]potraktowano dosłownie (tak jak [b-a]). W każdym razie, jeśli chcesz dopasować od np. ;Do nawiasu zamykającego, możesz użyć zakresu do znaku przed ](który jest odwrotnym ukośnikiem) i uwzględnić ]jako pierwszy znak w wyrażeniu nawiasu, np [];-\\].
don_crissti
@don_crissti Co z [[.^.]-[.-.]]? Mam wrażenie, że to zadziała. Załóżmy, że kod ASCII ^jest wcześniejszy -.
iBug
Mam leniwe rozwiązanie mojego pytania. Po prostu zdobądź wszystko, co wyjątkowe, do zestawiania postaci, na przykład[^[.].][.-.]/\^:]
iBug
7

O dziwo, musisz mieć kilka postaci w określonych miejscach. Musisz mieć ]jako pierwszy znak w zestawie i -musi być ostatnim znakiem w zestawie.

Oto RE, który spełnia twoje wymagania [^]\^/-]:

echo 'Hello[world]-[sun] ^^ 4/5 or 3\4' | grep -Eo '[^]\^/-]' | xargs
H e l l o [ w o r l d [ s u n 4 5 o r 3 4
roaima
źródło
1
To nie jest naprawdę dziwne, trzeba tylko uniknąć dwuznaczności
Kevin
1
Druga [postać tam nie należy; OP nie chce tego wykluczyć.
Scott
@ Scott dobrze zauważony, dziękuję. Odpowiedź zaktualizowana.
roaima