Właśnie natrafiłem na skrypt bash. Co [[:space:]]
oznacza skrypt bash? Dlaczego podwójny dwukropek?
Jest to rzeczywiście instrukcja obsługi bash, ale pomaga wiedzieć, czego szukasz, co nie jest pomocne, jeśli nie wiesz, na co patrzysz. Jeśli szukasz [[
, rozprasza Cię [[ expression ]]
sekcja wyrażeń warunkowych. Ponadto wyszukiwanie :space:
wyląduje w dwóch przykładach w tej samej sekcji. W tym przykładzie możesz śledzić nawigację:
Na przykład, poniższe dopasuje linię (zapisaną w linii zmiennej powłoki), jeśli w wartości znajduje się ciąg znaków składający się z dowolnej liczby, w tym zero, spacji, zera lub jednego wystąpienia „a”, a następnie 'b':
[[ $line =~ [[:space:]]*?(a)b ]]
... z którego można poskładać razem, że ta [[:space:]]
część odpowiada „znakom spacji”, ale można wybaczyć, że myślała, że jest to tylko dosłowny znak spacji, a nie cała klasa znaków, co reprezentuje.
Jeśli (zdarzyło Ci się?) Wyszukać ciąg znaków " space"
(tj. Spację, po której następuje słowo „spacja”) w podręczniku bash online , istnieje „tylko” około 32 dopasowań do przejścia. O dziesiątej będzie tutaj:
W obrębie „[” i „]” klasy znaków można określić za pomocą składni [: class:], gdzie klasa jest jedną z następujących klas zdefiniowanych w standardzie POSIX:
alnum alpha ascii blank cntrl digit graph lower print punct space upper word xdigit
Klasa znaków pasuje do dowolnego znaku należącego do tej klasy.
Który następnie zabrałby cię do standardu POSIX, gdzie możesz wyszukać termin „klasa znaków” i znaleźć
wctype, wctype_l - zdefiniuj klasę znaków , która doprowadzi cię do:
Funkcje wctype () [CX] [Opcja Start] i wctype_l () [Opcja Koniec] określają wartości wctype_t zgodnie z regułami zestawu znaków kodowanych zdefiniowanymi przez informacje o typie znaku w bieżących ustawieniach regionalnych [CX] [Opcja Start] lub w ustawieniach regionalnych reprezentowanych przez ustawienia regionalne, odpowiednio [Koniec opcji] (kategoria LC_CTYPE).
Jeśli następnie użyjesz linku setlocale , w końcu uzyskasz prawdziwą odpowiedź w sekcji Ustawienia regionalne :
przestrzeń
Zdefiniuj znaki, które będą klasyfikowane jako białe znaki. W ustawieniach regionalnych POSIX należy dokładnie
<space>, <form-feed>, <newline>, <carriage-return>, <tab>, and <vertical-tab>
uwzględnić.W pliku definicji ustawień regionalnych nie należy podawać znaków dla słów kluczowych górna, dolna, alfa, cyfra, wykres lub xdigit.
<space>, <form-feed>, <newline>, <carriage-return>, <tab>, and <vertical-tab>
Przenośnego zestawu znaków, oraz wszelkich znaków zawartych w blankiecie klasy są automatycznie uwzględniane w tej klasie.
LESS=+'/Within \[ and \],' man bash
zamiast 32n
poleceń ext :-).less +"$cmd"
, więc dzięki za to.[]
jest niezależne od tego, co wewnętrzne[]
. Próbowałem (!) Znaleźć drogę od pytania do odpowiedzi, nie wiedząc zbyt wiele o odpowiedzi, choć zajęło to trochę zgadywania :)Nie dotyczy tylko Bash, jest częścią notacji POSIX.
Co to jest POSIX?
Wyrażenia w nawiasach POSIX
Standardowy POSIX
Brak standardów
starsza składnia (czy ktoś może znaleźć odniesienie do nich?)
Więcej informacji można znaleźć tutaj: wiki
źródło
[[:ascii:]]
, i[[:word:]]
nie są klasami POSIX (wydają się byćbash
specyficzne), i nie mogę znaleźć[[:<:]]
ani[[:>:]]
jednego, ani drugiego. Lepszym odniesieniem może być pubs.opengroup.org/onlinepubs/9699919799/basedefs/…[[:ascii:]]
i[[:word:]]
nie są żadnymi standardowymi klasami POSIX. na[[:<:]]
i[[:>:]]
nie mogę znaleźć żadnych odniesień, ale jest to samo\b
. en.wikipedia.org/wiki/Regular_expression#Character_classes[[:<:]]
i twierdzi, że: Jest to rozszerzenie zgodne z POSIX 1003.2, ale nieokreślone[[:<:]]
jest również w FreeBSD, z tym samym zastrzeżeniem co PostgreSQL: freebsd.org/cgi/…[[:ascii:]]
i[[:word:]]
oczywiście pracy w bash w dopasowywania wzorców, ale nie w wyrażeniach regularnych (przynajmniej w moim systemie, myślę Bash używa regex biblioteki systemu). Bah.W wyrażeniach regularnych i globach nazw plików / wzorcach powłok
[...]
konstrukcja konstruuje dowolny znak z tych wymienionych w nawiasach. W tych nawiasach można użyć wielu nazwanych standardowych klas znaków . Jednym z nich jest[:space:]
dopasowanie znaków białych znaków (jak\s
w wyrażeniach regularnych Perla). Zobacz np. Dopasowywanie wzorców w instrukcji BashaJest więc
[[:space:]]
częścią wyrażenia regularnego lub dopasowania do wzorca, które pasuje tylko do białych znaków.Np. Dopasowanie wzorca (standardowa powłoka, nie specyficzna dla Bash):
lub regex (Bash):
Należy pamiętać, że mimo wyrażenia wspornik
[...]
działają tak samo w wyrażeniach regularnych i Shell wzory, są one na ogół bardzo dużo nie to samo. (case
i[[ string == pattern ]]
używaj dopasowania wzorca,[[ string =~ regex ]]
używa wyrażeń regularnych).Wyrażenia regularne również nie są specyficzne dla powłoki, są używane np.
awk
Ised
też i są opisane np. Na stronie podręcznika systemu Linuxregex(7)
źródło