05/02/2024

linux regex capture groups

örnek olarak elimizde bir string olsun

123-456-7890

bunu capture etmek icin

\d{3}-\d{3}-\d{4

yazmamiz gerekir bu bu string tamamini capture eder ve bunu $0 olarak 0nci grup olarak alir.

\d = digit

Parantezregex icinde cesitli amaçlar için kullanılır ancak grup yakalamak içinde kullanılır.

\d{3}-(\d{3})-\d{4}

Böyle yaptığımız zaman parantez içinde ki kısmı ayrı bir grup olarak yakala demiş oluyoruz. Bu yeni grup $1 yada \1 oluyor.

\d{3}-(\d{3})-(\d{4})

yaparsak soldan sağa ikinci grubuda yakalamış oluruz.

Dolar işaret replace etmek için kullanılır değişken gibi

backslash ise regexin içinde yakalanan birinci grubureferans etmek için kullanılır.
Örnek bir NGINX konfigürasyonu düşünün, pepiline ile ürettiğiniz test containerı diğerleri ile çakışmaması için pr(pull request) numarası +4000 gibi bir şekilde portu dinlesin. nginx bu şekilde karar verecek hangi istek hangi container portuna gidecek.

/etc/nginx/conf.d/pr.domains.com.conf :

server {
   listen 443 ssl;
   server_name ~^pr([1-9]~)\.sub1\.domain\.com;

   ssl_certificate /etc/ssl/cert.crt;
   ssl_certificate /etc/ssl/cert.key;

   location / {
      proxy_pass http://127.0.0.1:400$1;
      }
   }

Şimdi bu kısım incelendiğinde Pull Request (pr) sonucunda bır container 400X portunuda bekliyor.
eğer PR 4 ncü pr ise fqdn pr4.sub1.domain.com olacaktır ve bu durumda istekte otomatik olarak 4004 portuna gidecektir. Pipeline da containeri 4 nolu PR olduğu içim 4004 nolu portta başlatacaktır.

burda nginx conf un şu satırnını inceleyelim: ~^pr([1-9]~)\.sub1\.domain\.com;

Turuncu : regex kullanacağız.

Yeşil : pr ile başlayan

Mor : capture group tek basamaklı 1 ve 9 aralığı.

Şimdi :

  • capture group $0 = pr4.sub1.domain.com olacaktır
  • capture group $1 = 4 olacaktır. Nitekim bunuda daha sonra aşağıda ki satırda kullanıyoruz. proxy_pass http://127.0.0.1:400$1;