Wstęp

Dzień dobry, dziś opowiem o globbingu w systemie linux, czyli dopasowaniu wzorców. Serdecznie zapraszam.

Dawno dawno temu..

w UNIX V6, był sobie program _etc_glob, który rozwiązywał wieloznaczeniowe wzorce. Niedługo później, program ten został wbudowany w powłokę. Dziś jest jeszcze biblioteka glob(3), która wykona tę funkcje w programie użytkownika. - man glob.7

Znajdowanie wzorców

Łańcuch znaków jest wzorcem wieloznaczeniowym (wildcard pattern) jeśli zawiera jeden ze znaków: ? * [. Globbing jest operacją, która rozwiązuje wzorce do list z nazwami ścieżek, które pasują do wzorca.

  • znak ? (bez nawiasów) odpowiada każdemu, pojedynczemu znakowi
  • znak * (bez nawiasów) odpowiada każdemu łańcuchowi znakowemu, wliczając pusty łańcuch

Znaki

Wyrażenie […] odpowiada każdemu pojedynczemu znakowi znajdującemu się wewnątrz nawiasów, o ile pierwszym znakiem nie jest ! -> [!…]. Wtedy wyrażenie odwraca swoje działanie i powoduje wyłączenie znaków w nawiasie. Słowna reprezentacja tego wyrażenia brzmi: każdy znak zamknięty w nawiasach. Jeżeli zapiszemy [] to zostanie to rozwiązane do liberalnych znaków [ i ]

Zakresy

Dwa znaki, oddzielone znakiem - tworzą ciąg. Ciągi mogą być ASCII lub numeryczne np. [1-10] => {1,2,3,4,5,6,7,8,9,10} czy [a-d] => {a,b,c,d} Ciągi możemy łączyć np. [1-3a-c] => {1,2,3,a,b,c} albo nawet tworzyć kombinacje: [1-3][a-c] => {1a,1b,1c,2a,2b,2c,3a,3b,3c}

Wyłączanie znaków

wyrażenia składające się z [!…] wyłączają znaki znajdujące się za ! z rozwiązywania wzorców. I tak wyrażenie [!abc] oznacza: każdy znak o ile nie jest to a,b lub c

Ucieczka

jeżeli potrzebujemy użyć znaków specjalnych, takich jak ?,* lub [. Powinniśmy poprzedzić je znakiem \ jednak można ten sam efek uzyska zamykając wyrażenie z nawiasami kwadratowymi, w cudzysłowie. I tak, wyrażenie: [[?*\] odpowiada czterem znakom - [, ?, * i \.

Puste listy

Globbing zwróci błąd, przy niepoprawnym syntaktycznie wzorcu lub gdy wzorzec nie zostanie dopasowany. Jednak, możliwe są pewne wzorce, które nie zwrócą błędu mimo niedopasowania wzorca. Takie wzorce posiadają wyrażenie z lewej strony i są zakończone literałem, np. *.gif jest poprawnym semantycznie wzorcem, jednak nie jest wymagane, by jakikolwiek plik z rozszerzeniem gif został dopasowany.

Klasy znaków

Globbing dostarcza nam kilka klas znakowych, aby przyśpieszyć nam pracę. Są to:

  • [:alnum:] - dowolny z [:digit:] lub [:alpha:]
  • [:alpha:] - dowolna litera, nie ważne mała czy duża [a-zA-Z]
  • [:blank:] - spacja lub tabulacja
  • [:cntrl:] - dowolny znak z kodem ósemkowym od 000 do 037 + DEL (177)
  • [:digit:] - dowolna cyfra od 0 do 9
  • [:graph:] - wszystko, co nie jest [:alnum:] lub [:punct:]
  • [:lower:] - dowolna mała litera [a-z]
  • [:print:] - dowolny znak, który jest w [:space:] ale nie jest w [:graph:]
  • [:punct:] - dowolny, ze znaków specjalnych ! „ # $ % & ‚ ( ) * + , - . / : ; < = > ? @ [ \ ] ^ _ { | } ~ `
  • [:space:] - dowolny z CR FF HT NL VT SPACE
  • [:upper:] - dowolna wielka litera [A-Z]
  • [:xdigit:] - dowolny znak użyty w systemie szesnastkowym [a-f1-9]

Epilog

Na dziś wystarczy, mam nadzieję, że dowiedziałeś_łaś się czegoś nowego, albo odświeżyłeś_łaś sobie wiedzę. Tak czy inaczej, serdecznie Ci dziękuję, za przeczytanie tego posta. Jeśli masz potrzebę o cos zapytać, kontakt znajdziesz w zakładce „O Mnie”. A teraz życzę miłego dzionka i smacznej kawusi :) Do widzenia.