Вам потребуется использовать расширенные операторы глобуса ksh (подмножество которых доступно в bash
с shopt -s extglob
и с zsh
с установите -o kshglob
), чтобы получить эквивалент регулярных выражений (но с другим синтаксисом: * (x)
для эквивалента x *
здесь):
shopt -s extglob # for bash
# set -o kshglob # for zsh
printf '%s\n' "${MYVAR//[[:alpha:]]*([[:alnum:]-])/}"
Или с zsh
extendedglob
s, где эквивалент регулярного выражения *
- #
:
set -o extendedglob
printf '%s\n' ${MYVAR//[[:alpha:]][[:alnum:]-]#}
Несколько примечаний:
$ { var / pattern / replacement}
заменяет только первое вхождение. Используйте $ {var // pattern / replace}
, чтобы заменить каждое вхождение (например, с флагом g
в команде sed
s
] ). $ {var // pattern /}
(или $ {var // pattern}
) для замены пустой строкой. echo
для вывода произвольных строк zsh
, расширения переменных в контекстах списков должны быть заключены в кавычки sed
, когда переменная содержит символы новой строки. [az]
соответствует символам (элементы сопоставления в некоторых инструментах), которые находятся между a
и z
, список который зависит от локали, системы и инструмента (например, [az]
с bash-4.3
в en_GB.Локаль UTF-8
в системе GNU соответствует A
, X
, é
, Ẃ
, но не Z
). Обычно это 26 строчных букв английского алфавита, но не обязательно. [[: alpha:]]
включает символы (или элементы сопоставления), которые считаются алфавитными (независимо от регистра) в вашем регионе. Если вы хотите сопоставить только 26 английских букв, либо используйте [abcdefghijklmnopqrstuvwxyz]
, либо исправьте языковой стандарт на C
( LC_ALL = C
) и используйте [az]
или [[: lower:]]
только для строчных букв английского алфавита или [a-zA-Z]
/ [[: alpha:] ]
для любой английской буквы. [a-z0-9 \ -]
в sed
соответствует символу обратной косой черты, используйте [a-z0-9 -]
вместо этого ( -
должно быть первым или последним, чтобы понимать буквально). Не переходите к удалению файлов блокировки, как только обнаружите эту проблему. Может быть какой-то процесс, фактически обновляющий пакеты. Возможно, стоит подождать несколько минут.
У меня это выдало ошибку ниже:
athakur:~$ sudo apt-get upgrade
E: Could not get lock /var/lib/dpkg/lock-frontend - open (11: Resource temporarily unavailable)
E: Unable to acquire the dpkg frontend lock (/var/lib/dpkg/lock-frontend), is another process using it?
Я вошел в свою систему Ubuntu после долгого времени, и какой-то внутренний процесс что-то обновлял. Это решилось само по себе (заняло около 5 минут ).
Вы можете проверить это с помощью таких команд, как
Если вы видите запущенный процесс типа " apt.systemd.daily ", подождите некоторое время.Если нет, вы можете убить эти процессы и возобновить то, что хотели.
Замените PID на PID, полученные с помощью приведенной выше команды. Затем вы можете запустить
sudo dpkg --configure -a
, чтобы позволить dpkg исправить себя. В любом случае удаляйте файлы блокировки только в крайнем случае.
Я установил Ubuntu Mate 20.04 на свой новый RPi 4 B. Запустил программу обновления со страницы приветствия и получил сообщение «ожидание автоматического обновления». Я нажал кнопку остановки во всплывающем окне, и другое всплывающее окно предложило частичное обновление. Попытка снова привела к сообщению «ожидание автоматического обновления». Я закрылся из меню и снова попытался обновиться со страницы приветствия, и снова получил сообщение «ожидание автоматического обновления». Я снова выключился из меню, а затем выключил питание RPi. После перезагрузки я запустил программу обновления со страницы приветствия, и на этот раз она сработала. Надеюсь, это поможет кому-то.
Вот моя рекомендация:
запущена служба автоматического обновления
systemctl list-units --type=service | grep upgr
unattended-upgrades.service
loaded active running Unattended Upgrades Shutdown
остановить службу («остановить», а не «отключить»)
sudo systemctl stop unattended-upgrades
доказательство, он больше не работает:
systemctl list-units --type=service | grep upgr
( nothing )
$>
сделай апгрейд
После перезагрузки (или повторного запуска вручную )служба снова автоматически запустится. Таким образом, нет опасности оставить постоянную проблему безопасности. Вы можете убедиться в этом, набрав еще раз:
systemctl list-units --type=service | grep upgr
unattended-upgrades.service
loaded active running Unattended Upgrades Shutdown
Шаг 1 :Найдите идентификатор [pid] процесса-нарушителя sudo lsof /var/lib/dpkg/lock-frontend
Шаг 2 :Завершение процесса sudo kill -9 [pid]
Примечание. :Пожалуйста, не пытайтесь выполнить это без ожидания 10 -Сначала 20 минут, вы хотите дать процессу время для завершения своей задачи, если он не завершится примерно через 20 минут, вы можете считать процесс застревает и может быть прекращено.
Как упоминалось в предыдущих ответах, весьма вероятно, что задача ежедневного обновления продолжается. Я понимаю, что вопрос в том, как не получить ошибку, но в большинстве случаев вы можете подождать (, когда я начал искать эту проблему и наткнулся на это обсуждение ). Ожидание долгое, особенно если вы только что установили дистрибутив, используя старый live CD/DVD, потому что будет много ожидающих обновлений. Косвенный способ получить представление о времени ожидания — проверить ход автоматического обновления с помощью sudo apt update
.В самом конце вывода вы увидите, сколько пакетов нужно обновить (, фактический список генерируетсяapt list --upgradable
). Количество пакетов, которые можно обновить, будет продолжать уменьшаться, поскольку средство автоматического обновления -работает.
Просто перезагрузите систему, и автоматическое обновление программного обеспечения будет автоматически закрыто. Затем вы можете легко обновить либо с помощью приложения для обновления программного обеспечения, либо просто запустив «sudo apt update» в терминале.