Bash регулярное выражение или нет - PullRequest
0 голосов
/ 09 декабря 2018

Я создал это регулярное выражение:

'^CPU\s+LOAD\:\s+([0-9]{1,3})\s+Average\:\s+([0-9]{1,3}).?$'

, чтобы сопоставить и извлечь значения из моей строки:

"Загрузка процессора: 100 Среднее: 89"

, но иногдазначения будут недоступны, например:

"Загрузка процессора: средняя: 89"

"Загрузка процессора: средняя 100:"

"Загрузка процессора: средняя:"

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

Итак, я попробовал несколько вещей и думаю, что это:

'^CPU\s+LOAD\:\s+([[0-9]{1,3}]?)\s+Average\:\s+([[0-9]{1,3}]?).?$'

должно работать, но это не так.Это правильный синтаксис?

Это мой тестовый код, который хочет потерпеть неудачу. Ответ 1 Я перешел по ссылке, и, похоже, она работает на странице ссылки.

rx='^CPU\s+LOAD\:\s+(?:([0-9]{1,3})\s+)?Average:(?:\s+([0-9]{1,3}))?$'
line="CPU LOAD: 89 Average: 99"
  if [[ $line =~ $rx ]]; then
    printf "\n\n${BASH_REMATCH[1]} ${BASH_REMATCH[2]}\n\n"
  else
    printf "\n\nDidn't Match\n\n"
  fi

Я обновил

rx='^CPU\ +LOAD\:\ +(([0-9]{1,3})\ +)?Average:(\ +([0-9]{1,3}))?$'

и "Загрузка процессора: 100 в среднем: 89" проходит

"Загрузка процессора: в среднем: 89" проходит

"Загрузка процессора: 100 в среднем:" не выполняется

Последние обновления требуют от меня:

 printf "\n\n${BASH_REMATCH[1]} ${BASH_REMATCH[2]} ${BASH_REMATCH[3]} ${BASH_REMATCH[4]}\n\n"

Чтобы захватить все и поместить одно значение в

${BASH_REMATCH[1]} ${BASH_REMATCH[2]}

Спасибо за помощь Forth Bird.Это последний код, который работает для моих нужд.

rx='^CPU\s+LOAD:\s+(([0-9]{1,3})\s+)?Average:(\s+([0-9]{1,3}))?.?$'

1 Ответ

0 голосов
/ 09 декабря 2018

Что вы можете сделать, это использовать необязательную группу без захвата:

^CPU[[:blank:]]+LOAD\:[[:blank:]]+(([0-9]{1,3})[[:blank:]]+)?Average:([[:blank:]]+([0-9]{1,3}))?$

См. Демонстрационную версию regex

Вы можете сопоставитьпробел, выбрав его или используйте [[:blank:]] для сопоставления пробела или табуляции.

rx='^CPU[[:blank:]]+LOAD\:[[:blank:]]+(([0-9]{1,3})[[:blank:]]+)?Average:([[:blank:]]+([0-9]{1,3}))?$'
line="CPU LOAD: 89 Average: 99"
if [[ $line =~ $rx ]]; then
    printf "\n\n${BASH_REMATCH[2]} ${BASH_REMATCH[4]}\n\n"
else
    printf "\n\nDidn't Match\n\n"
fi

Демо

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