Перебор массива строк с применением регулярного выражения к каждому элементу в Korn Shell

my Debian systemd stopped starting any service

В предоставленном журнале нет указаний на то, что это действительно так.

the system suddenly gets stucked receiving watchdog events ad infinitum.

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

How could I find out what the problem is?

Поставьте правильный диагноз.

Если проблема связана со службой SSH, просмотрите журналы службы SSH . Не делайте поспешных выводов о том, что ваша система не запускает никаких служб без журналов сбоев при запуске служб. Действительно, не делайте поспешных выводов о том, что проблема связана с systemd, не определив, почему вы не можете -войти в систему. Тайм-аут, отклоненное соединение и отклоненная проверка подлинности могут иметь очень разные основные причины, некоторые из которых могут вообще не быть чем-либо на вашем компьютере.

Действуйте систематически и методично, держа в руках журналы на каждом этапе.

the mail is never sent.

Вы раздули одну проблему на две. Теперь у вас есть дополнительная задача определить, как работает ваша почтовая система, чтобы , а затем определить, как работает что-то еще. Это не лучший подход. Логи — ваш друг.

2
05.11.2019, 18:27
2 ответа

Я нигде не вижу на справочной странице ksh, что можно сопоставить строку с регулярным выражением и использовать скобки для извлечения подстрок (, как в bash с

[[ $str =~ ^([[:alnum:]]+([ -]+[[:alnum:]]+)+) ]] && echo "${BASH_REMATCH[1]}"

Однако вы можете использовать расширенные регулярные выражения в шаблонах глобусов с помощью ~(E:regex), так что вы можете сделать это:

for n in "${names[@]}"; do
  # remove the pattern from the start of the string
  tmp=${n##~(E:\w+([ -]+\w+)*)}
  # and then remove what remained from the end of the string
  echo "[${n%$tmp}]"
done
[Jill Shortz]
[Bill Torts]
[Will Courtz]
[Phil-Lip Warts]

... а для максимальной записи -только нечитаемость

for n in "${names[@]}"; do
  echo "${n%${n##~(E:\w+([ -]+\w+)*)}}"
done
4
27.01.2020, 21:50

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

names=( "${names[@]%%,*}" )
printf '"%s"\n' "${names[@]}"

Это удаляет первую запятую и все после нее из каждого элемента массива отдельно (буквально «самый длинный суффикс, соответствующий шаблону подстановки ,*» ). Результирующий список измененных имен затем повторно -присваивается массиву names(и печатается с помощьюprintf).

Код, учитывая вашу первоначальную инициализацию массива в списке в вопросе, будет генерировать

"Jill Shortz"
"Bill Torts"
"Will Courtz"
"Phil-Lip Warts"

(двойные кавычки добавляются строкой формата printf).

Код будет работать с ksh93, bash, zshи yash.

6
27.01.2020, 21:50

Теги

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