как найти реальный путь к папке с регулярным выражением

Использование jq с булевыми тестами

Учитывая, что ваш JSON хранится в переменной с именем json, вы можете сделать следующее в подсказке shell:

$ echo "$json" | jq '.client.state | test("tiling")'
false

Это правильно возвращает false, потому что ваш корпус содержит значение floating вместо этого.

Отрицание тестов

В качестве альтернативы, если вы хотите проверить, что значение not tiling, вы можете использовать фильтр | not, чтобы отрицать логику вашего теста. Например:

$ echo "$json" | jq '.client.state | test("tiling") | not'
true

Это правильно возвращает true, потому что состояние клиента не плиточное, а плавающее.

Извлечение значения

Если вы хотите убедиться, что ваши фильтры работают в нормальном режиме, вы также можете использовать jq для извлечения значения для вложенного ключа. Например:

$ echo "$json" | jq .client.state
"floating"

Затем вы можете использовать эту информацию для проверки ваших тестов и фильтров, или просто передать ее по shell-конвейеру в fgrep или fgrep -v, если вы не против породить дополнительный процесс.

2
27.02.2019, 19:29
2 ответа

В зависимости от того, какую оболочку вы используете, вы можете сделать это с помощью подстановки.

баш

#! /bin/bash -
shopt -s nullglob extglob
dirs=(/application/DB/presto/presto-server-+([[:digit:]])*(.+([[:digit:]])))

printf '%s\n' "Found ${#dirs[@]} matching directories:" "${dirs[@]}"

зш

#! /bin/zsh -
set -o extendedglob
dirs=(/application/DB/presto/presto-server-<->(.<->)#(N))

printf '%s\n' "Found $#dirs matching directories:" $dirs

кш93

#! /bin/ksh93
dirs=(~(N)/application/DB/presto/presto-server-+([[:digit:]])*(.+([[:digit:]])))

printf '%s\n' "Found ${#dirs[@]} matching directories:" "${dirs[@]}"

Для всех это presto-server-, за которым следует последовательность из 1 или более цифр, за которой следует 0 или более последовательностей .<digits>.

3
27.01.2020, 21:58

С помощью теста GNU find -regexвы можете использовать:

find /application/DB/presto/ -regex '/application/DB/presto/presto-server-\([0-9]*\.\)?[0-9]+'

... для этого требуется начальный путь, а затем числовая часть:

  • опционально :первые цифры и точка
  • одна или несколько цифр

Это соответствует всем и только вашим «правильным» примерам и ни одному из ваших «недопустимых» примеров.

Измените [0-9]*на [0-9]+, если вы хотите, чтобы перед любым начальным периодом требовалась цифра; разница между:

/application/DB/presto/presto-server-0.936

и

/application/DB/presto/presto-server-.936

1
27.01.2020, 21:58

Теги

Похожие вопросы