Команда поиска Linux с поддержкой Regex не возвращается - PullRequest
1 голос
/ 16 апреля 2019

Будучи новичком в bash-скриптинге, я решил попробовать и протестировать мой текущий проект с самого начала.В настоящее время у меня проблема с одной строкой кода.с его помощью я пытаюсь найти в каталоге output_json файлы, соответствующие регулярному выражению.

, прежде чем я покажу какой-либо код, приведена структура каталога, в которой выполняется скрипт:

fullпуть к рабочему каталогу:

C:\Users\chris\Google Drive\code projects\Replacement Program for Chile Letters\tests\general bash unit tests.

дерево каталогов текущего рабочего каталога:

├───general bash unit tests  <--(working dir)
    ├───node_fake_returns
    └───output_json
        ├───email_data-1.json
        ├───email_data-2.json
        ├───email_data-3.json
        ├───variable_data-1.json 
        ├───variable_data-2.json
        └───variable_data-3.json

строка, которую я пытаюсь использовать для возврата массива, содержащего все имена файлов variable_data файлов выглядит следующим образом:

local contentVars=$(find "./output_json" -regextype posix-extended \
  -regex '.*/output_json/variable_data-\d+.json')

Вот вся функция, используемая для модульного тестирования, на случай, если у меня что-то не так с модульным тестом.обратите внимание, что функция утверждения взята из shunit2.

testFileNameCapturing() {

    local contentVars=$(find "./output_json" -regextype posix-extended \
      -regex '.*/output_json/variable_data-\d+.json')
    local emailDataVars=$(find "./output_json" -regextype posix-extended \
      -regex 'variable_data-\d+.json')

    assertTrue "[ $contentVars == './output_json/variable_data-1.json' ]"
}

Я уверен, что это всего лишь небольшая синтаксическая ошибка, но она действительно застопорила меня большую часть дня.Любая помощь будет отличной!

1 Ответ

1 голос
/ 16 апреля 2019

У меня есть 2 части. На вопрос о регулярных выражениях и на упрощение кода модульного теста.


На регулярном выражении:

Что касается регулярного выражения, я согласен, что в реализации обработки регулярного выражения в GNU find есть что-то странное.

Документация для GNU find regex найдена здесь .

Если вы используете стандартное выражение поиска GNU по умолчанию, вы можете написать это:

▶ find ./output_json -regex './output_json/variable_data-[0-9]+\.json'                       
./output_json/variable_data-1.json
./output_json/variable_data-3.json
./output_json/variable_data-2.json

Однако, используя расширенный POSIX, я бы, как и вы, ожидал, что \d будет соответствовать цифре. Это работает здесь например.

Но в GNU найти регулярное выражение с расширением posix документы нет упоминания о \d, только [[:digit:]].

Таким образом, это работает:

▶ find "./output_json" -regextype posix-extended -regex './output_json/variable_data-[[:digit:]]+\.json'
./output_json/variable_data-1.json
./output_json/variable_data-3.json
./output_json/variable_data-2.json

При исправлении вашего кода:

Я думаю, что вы должны упростить свой код и вообще избегать регулярных выражений, а просто использовать шаблон glob:

local contentVars=$(find ./output_json -name "variable_data-[0-9]*.json")

Это проще, проще для понимания и не зависит от расширения GNU, поэтому оно более переносимо.

Однако это не будет возвращать массив, но будет строка, разделенная новой строкой, и сделанное вами утверждение:

assertTrue "[ $contentVars == './output_json/variable_data-1.json' ]"

должен потерпеть неудачу. Возможно, попробуйте:

testFileNameCapturing() {
  local contentVars=$(find output_json/ -name "variable_data-[0-9]*.json")

  local expected="output_json/variable_data-1.json
output_json/variable_data-3.json
output_json/variable_data-2.json"

  assertEquals "$expected" "$contentVars"
}

. shunit2

Выход:

testFileNameCapturing

Ran 1 test.

OK
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...