Хотя название вопроса относится именно к Regex, я бы согласился с любым решением проблемы, которое я объясняю в теле вопроса
Контекст:
У меня есть скрипткоторый передает все свои параметры ($ @) другому сценарию после выполнения некоторых действий с одним из аргументов.Детали выходят за рамки этого вопроса, но я рад обсудить их в комментариях, если это необходимо.
Что я ищу:
Что я хочудолжен иметь возможность изменить мое регулярное выражение (см. ниже), чтобы мне не нужно было поддерживать белый список в формате: ... (?= command1| command2| command3)
... [edit:] , где command*
можетбыть любым словом вообще
Я хочу иметь возможность включать весь текстовый BLOB-объект, передаваемый в аргумент (-p, --project), включая кавычки, если они присутствуют, в новую переменную.
Попытки:
Я успешно создал регулярное выражение, которое решает мою непосредственную проблему, , пожалуйста, посмотрите объяснение здесь .Я думаю, что это объясняет мою проблему с помощью примеров.
Regex Я построил:
(?:-p|--project)[= ]\K(.*)(?= command1| command2| command3)
Тестовые строки:
pretend-cli -p /path\ to\ data/path/to/data01 command1 --some-other=123
pretend-cli -p "/path to data/path/to/data02" command2 --some-other=123
pretend-cli -p '/path to data/path/to/data03' command3 --some-other=123
pretend-cli -p=/path\ to\ data/path/to/data04 command1 --some-other=123
pretend-cli -p="/path to data/path/to/data05" command2 --some-other=123
pretend-cli -p='/path to data/path/to/data06' command3 --some-other=123
pretend-cli --project /path\ to\ data/path/to/data07 command1 --some-other=123
pretend-cli --project "/path to data/path/to/data08" command2 --some-other=123
pretend-cli --project '/path to data/path/to/data09' command3 --some-other=123
pretend-cli --project=/path\ to\ data/path/to/data10 command1 --some-other=123
pretend-cli --project="/path to data/path/to/data11" command2 --some-other=123
pretend-cli --project='/path to data/path/to/data12' command3 --some-other=123
Но какВы видите, это требует, чтобы я вел белый список.
Дальнейшее объяснение
Как это будет выглядеть в текущей реализации моего скрипта (12 отдельных тестовых случаев):
PRETEND_PARAMETERS_01="-p /path\ to\ data/path/to/data01 command1 --some-other=123"
PRETEND_PARAMETERS_02="-p \"/path to data/path/to/data02\" command2 --some-other=123"
PRETEND_PARAMETERS_03="-p '/path to data/path/to/data03' command3 --some-other=123"
PRETEND_PARAMETERS_04="-p=/path\ to\ data/path/to/data04 command1 --some-other=123"
PRETEND_PARAMETERS_05="-p=\"/path to data/path/to/data05\" command2 --some-other=123"
PRETEND_PARAMETERS_06="-p='/path to data/path/to/data06' command3 --some-other=123"
PRETEND_PARAMETERS_07="--project /path\ to\ data/path/to/data07 command1 --some-other=123"
PRETEND_PARAMETERS_08="--project \"/path to data/path/to/data08\" command2 --some-other=123"
PRETEND_PARAMETERS_09="--project '/path to data/path/to/data09' command3 --some-other=123"
PRETEND_PARAMETERS_10="--project=/path\ to\ data/path/to/data10 command1 --some-other=123"
PRETEND_PARAMETERS_11="--project=\"/path to data/path/to/data11\" command2 --some-other=123"
PRETEND_PARAMETERS_12="--project='/path to data/path/to/data12' command3 --some-other=123"
СпособЯ анализирую «путь проекта» из этих параметров:
PRETEND_PROJECT_PATH_01=$(grep -oP '(?:-p|--project)[= ]\K(.*)(?= command1| command2| command3)' <<< ${PRETEND_PARAMETERS_01})
PRETEND_PROJECT_PATH_02=$(grep -oP '(?:-p|--project)[= ]\K(.*)(?= command1| command2| command3)' <<< ${PRETEND_PARAMETERS_02})
PRETEND_PROJECT_PATH_03=$(grep -oP '(?:-p|--project)[= ]\K(.*)(?= command1| command2| command3)' <<< ${PRETEND_PARAMETERS_03})
PRETEND_PROJECT_PATH_04=$(grep -oP '(?:-p|--project)[= ]\K(.*)(?= command1| command2| command3)' <<< ${PRETEND_PARAMETERS_04})
PRETEND_PROJECT_PATH_05=$(grep -oP '(?:-p|--project)[= ]\K(.*)(?= command1| command2| command3)' <<< ${PRETEND_PARAMETERS_05})
PRETEND_PROJECT_PATH_06=$(grep -oP '(?:-p|--project)[= ]\K(.*)(?= command1| command2| command3)' <<< ${PRETEND_PARAMETERS_06})
PRETEND_PROJECT_PATH_07=$(grep -oP '(?:-p|--project)[= ]\K(.*)(?= command1| command2| command3)' <<< ${PRETEND_PARAMETERS_07})
PRETEND_PROJECT_PATH_08=$(grep -oP '(?:-p|--project)[= ]\K(.*)(?= command1| command2| command3)' <<< ${PRETEND_PARAMETERS_08})
PRETEND_PROJECT_PATH_09=$(grep -oP '(?:-p|--project)[= ]\K(.*)(?= command1| command2| command3)' <<< ${PRETEND_PARAMETERS_09})
PRETEND_PROJECT_PATH_10=$(grep -oP '(?:-p|--project)[= ]\K(.*)(?= command1| command2| command3)' <<< ${PRETEND_PARAMETERS_10})
PRETEND_PROJECT_PATH_11=$(grep -oP '(?:-p|--project)[= ]\K(.*)(?= command1| command2| command3)' <<< ${PRETEND_PARAMETERS_11})
PRETEND_PROJECT_PATH_12=$(grep -oP '(?:-p|--project)[= ]\K(.*)(?= command1| command2| command3)' <<< ${PRETEND_PARAMETERS_12})
Чтобы увидеть, что содержат эти новые переменные:
echo ${PRETEND_PROJECT_PATH_01}
echo ${PRETEND_PROJECT_PATH_02}
echo ${PRETEND_PROJECT_PATH_03}
echo ${PRETEND_PROJECT_PATH_04}
echo ${PRETEND_PROJECT_PATH_05}
echo ${PRETEND_PROJECT_PATH_06}
echo ${PRETEND_PROJECT_PATH_07}
echo ${PRETEND_PROJECT_PATH_08}
echo ${PRETEND_PROJECT_PATH_09}
echo ${PRETEND_PROJECT_PATH_10}
echo ${PRETEND_PROJECT_PATH_11}
echo ${PRETEND_PROJECT_PATH_12}