Может быть, что-то вроде:
sed 'H;/#$/!d;s/^/\
/;x;/\n%/!d;s/.//;x;s/.*//;x'
Поскольку вы хотите, чтобы приглашение было перед ошибкой и после ошибки, оно включает в себя оба, за исключением подсказок, которые в противном случае появлялись бы как подсказка после одной ошибки, так и как подсказка перед следующей ошибкой. соответствовать вашему образцу вывода.
Намного проще, если мы включим оба приглашения, независимо от того, следуют ли ошибки друг за другом или нет:
sed 'H;/#$/!d;x;/\n%/!d'
Если бы вы хотели, чтобы перед ошибкой отображалось только приглашение, это также было бы намного проще:
sed '/#$/!{H;d;}
x;/\n%/!d'
Вероятно, лучший способ чтобы объяснить это, нужно перевести на более подробный язык, например perl
. В sed
пространство удержания похоже на статическую переменную, которая инициализируется пустой строкой, а пространство шаблонов - это переменная, которую sed
по очереди назначает каждой строке ввода. Примерно так:
$hold_space = "\n";
LINE: while ($pattern_space = <>) {
<sed commands go here>
print $pattern_space; # unless -n option is passed
}
Команда H
преобразуется в:
$hold_space .= $pattern_space;
Команда d
преобразуется в:
next LINE;
То есть прекратить выполнение команд, отбросить пространство шаблонов и начать заново со следующей строкой ввода.
x
меняет местами шаблон и удерживает пробел:
($pattern_space, $hold_space) = ($hold_space, $pattern_space);
Таким образом, последняя команда sed
преобразуется в:
$hold_space = "\n";
LINE: while ($pattern_space = <>) {
if (! ($pattern_space =~ /#$/)) { # anything other than a prompt
$hold_space .= $pattern_space;
next LINE;
}
($pattern_space, $hold_space) = ($hold_space, $pattern_space);
if (! ($pattern_space =~ /\n%/)) {
next LINE;
}
print $pattern_space;
}
Что может быть переписано более разборчиво как:
LINE: while ($pattern_space = <>) {
if ($pattern_space =~ /#$/)) {
if ($hold_space =~ /\n%/)) {
print $hold_space;
}
$hold_space = $pattern_space;
} else {
$hold_space .= $pattern_space;
}
}
Rename $ pattern_space
в $ line
и $ hold_space
в $ current_block
, и он становится еще более разборчивым.
Попробуйте перезагрузить хост-компьютер.
Это кажется странным, но это только что случилось со мной. Я использую Debian Stretch, и при установке ОС gust (некоторого дистрибутива Ubuntu )на KVM в первый раз после установки я получил такое же предупреждение. Я выключил хост-компьютер, оставив проблему нерешенной, и на следующий день, пытаясь снова, я не получил никакой ошибки. При этом я абсолютно ничего не делал. Существует вероятность того, что KVM потребуется перезагрузка для полной установки или для сбора необходимых данных. Хотя я не уверен насчет арки, но вы можете попробовать, прежде чем переходить к другому решению.
У меня была та же проблема, и проблема заключалась в том, что libvirt не мог получить доступ к /dev/kvm
. Поэтому вам нужно убедиться, что у пользователя есть права доступа к узлу устройства, например, запустив chown root.kvm /dev/kvm;chmod 660 /dev/kvm
.
Я предполагаю, что он просто пытается настроить конфигурацию машины и возвращает эту ошибку, когда что-то не работает, поскольку считает, что проблема заключается в конфигурации.