chcę analizować ciągi podobne do następujących do oddzielnych zmiennych za pomocą wyrażeń regularnych z poziomu Bash:Opcjonalne parametry w bash wyrażenia regularnego
Category: entity;scheme="http://schemas.ogf.org/occi/core#";class="kind";title="Entity";attributes="occi.core.id occi.core.title";
lub
Category: resource;scheme="http://schemas.ogf.org/occi/core#";class="kind";title="Resource";rel="http://schemas.ogf.org/occi/core#entity";attributes="occi.core.summary";
Pierwsza część przed „tytuł” jest wspólny dla wszystkich łańcuchów, tytuł części i atrybuty są opcjonalne.
Udało mi się wyodrębnić obowiązkowe parametry wspólne dla wszystkich ciągów, ale mam problem z opcjonalnymi parametrami niekoniecznie występującymi we wszystkich ciągach. O ile się dowiedziałem, Bash nie obsługuje nieprzechwytujących nawiasów, których użyłbym w tym celu.
Oto co osiągnąłem do tej pory:
CATEGORY_REGEX='Category:\s*([^;]*);scheme="([^"]*)";class="([^"]*)";'
category_string='Category: entity;scheme="http://schemas.ogf.org/occi/core#";class="kind";title="Entity";attributes="occi.core.id occi.core.title";'
[[ $category_string =~ $CATEGORY_REGEX ]]
echo ${BASH_REMATCH[0]}
echo ${BASH_REMATCH[1]}
echo ${BASH_REMATCH[2]}
echo ${BASH_REMATCH[3]}
Wyrażenie regularne chciałbym użyć (i który pracuje dla mnie w Ruby) byłoby:
CATEGORY_REGEX='Category:\s*([^;]*);\s*scheme="([^"]*)";\s*class="([^"]*)";\s*(?:title="([^"]*)";)?\s*(?:rel="([^"]*)";)?\s*(?:location="([^"]*)";)?\s*(?:attributes="([^"]*)";)?\s*(?:actions="([^"]*)";)?'
Czy istnieje inne rozwiązanie do parsowania ciągu za pomocą narzędzi wiersza poleceń bez konieczności powrotu do perla, pythona czy ruby?
To naprawdę działa. To nie jest najbardziej eleganckie rozwiązanie, ale dopóki w bashie nie ma grup przechwytujących, obejście polegające na pomijaniu grupy za każdym razem jest prawdopodobnie najlepszym rozwiązaniem. Jedna rzecz wciąż mnie niepokoi: jeśli za dowolnym średnikiem są spacje, wyrażenie regularne nie działa, tak więc za nimi są "\ s *" wzorce pasujące do białych znaków. –
Wygląda na to, że znaki specjalne, takie jak "\ s *", nie działają. Zastąpienie go tylko spacją działało jednak: "\ s *" => "*" –
Spróbuj użyć [[: spacja:]] * zamiast \ s. –