Mam następujący Yaml:

role::project::conf::files:
  entry_01:
    - 'file "/var/project/some_file.txt" 5333;'
    - 'echo no;'
  entry_02:
    - 'file "/var/project/some_other_file.txt" 5334;'
    - 'echo yes;'
  entry_03:
    - 'file "/var/project/extra_file.txt" 5335;'
    - 'echo yes;'

Następnie użyłem następującego wyrażenia regularnego https://regex101.com/r/pvzsea/19// A> Aby wnieść wartość między tymi znakami CUTATION (REGEX działa w REGEX101.com), ale nie działa w marionetce:

each($files) | $files_itm | {
  if $files_itm[1] =~ /"([^"]*)"/ {
    #how to get only the path here in var
  }
}

Aktualizacja, klasa:

class role::project::conf (
  $files = [],
){
  each($files) | $files_itm | {
    if $files_itm[1] =~ /"([^"]*)"/ {
      notify { "file ${1} seen": }
    }
  }
}
-3
user14390627 19 październik 2020, 22:22

1 odpowiedź

Najlepsza odpowiedź

Użyłem następującego wyrażenia regularnego https://regex101.com/r/pvzsea/1 W celu zdobycia wartości pomiędzy te cudzysjeki (regex działa w regex101.com), ale nie Pracuj w marionetce:

each($files) | $files_itm | {
  if $files_itm[1] =~ /"([^"]*)"/ {
    #how to get only the path here in var
  }
}

Jak zauważyłem w komentarzach, marionetka wykorzystuje smak wyrażenia regularnego Ruby'ego. Nie jest to wśród tych wyraźnie wspieranych przez REGEX101, więc nie jest to poza pytaniem, że regex, który pracował, nie działa z marionetką. Jednak Ruby-Flavor Online Wyrażenie regularne Tester w pokazuje, że określone wyrażenie regularne działa dobrze w Ruby, w tym grupa dopasowania.

Nie pokazujesz, w jaki sposób próbowałeś uzyskać dopasowaną grupę w kodzie lalek, ale odpowiednia procedura jest podana w Dokumenty wyrażeń lalek Lalek. W szczególności:

W ramach warunkowych instrukcji i definicji węzłów, podciągami z [SIC] Nawiasy () w wyrażeniu regularnym są dostępne jako ponumerowane Zmienne wewnątrz sekcji powiązanej kodu. Pierwszy jest $1, The drugi to $2 i tak dalej. Cały mecz jest dostępny jako $0. Te nie są normalne zmienne i mają specjalne zachowania: [...]

Jest to również odzwierciedlone w Dokumentacja określonych stwierdzeń.

Masz tylko jedną grupę przechwytywania, więc wewnątrz korpusu kondycjonalnego oświadczenia można odnosić się do przechwyconych treści jako $1. Na przykład,

each($files) | $files_itm | {
  if $files_itm[1] =~ /"([^"]*)"/ {
    notify { "file ${1} seen": }
  }
}

Uwaga Jednakże, że zmienne grupy przechwytywania są dostępne tylko w organizmie oświadczenia warunkowego i poza wszelkimi zagnieżdżonymi warunkami, które mają zgodne wyrażenie regularne w ich stanie. Wydaje się również, że nie jest udokumentowany, co są implikacje, jeśli istnieją dwa lub więcej wyrażeń regex-mecz w tym samym stanie warunkowym stanie.

Aktualizacja

Ale aktualizacja na pytanie i komunikaty o błędach prezentowane w komentarzach pokazują, że problem, z którym się zmagasz, jest coś innego. Wartość związana z kluczem Hiera role::project::conf::files jest Hash , z klawiszami łańcuchowymi i wartościami tablicowymi, podczas gdy zdajesz się spodziewać tablicy zgodnie z domyślnym parametrem zakodowanym do klasy. Kiedy idziesz w przeszerzeniu Hash i uchwycić wpisy w pojedynczej zmiennej, zmienna ta przyjmie wartości tablicy dwuetapowej, gdzie pierwszy (element 0) jest kluczem wpisowym, a drugi (element 1) jest odpowiedniej wartości.

Tak więc, gdy dane Hiera przedstawione w pytaniu jest związane z parametrem $files, wyrażenie $files_itm[1] ocenia się do wartości tablicy, takich jak ['file "/var/project/some_file.txt" 5333;', 'echo no;']. Nie są to odpowiednie operanty z operatora {X3}}, co mówi komunikat o błędzie informujący.

Trudno powiedzieć, co tu naprawdę chcesz, ale to powinno uniknąć błędu (w połączeniu z danymi YAML):

each($files) | $itm_key, $itm_value | {
  if $itm_value[0] =~ /"([^"]*)"/ {
    notify { "file ${1} seen": }
  }
}
1
John Bollinger 19 październik 2020, 21:52