我最近不得不使用这个命令,因为由于 nvidia 包转移而出现一些错误,但我不完全知道它是如何工作的:
LC_MESSAGES=C dpkg-divert --list '*nvidia-340*' | sed -nre 's/^diversion of (.*) to .*/\1/p' | xargs -rd'\n' -n1 -- sudo dpkg-divert --remove
sudo apt --fix-broken install
我读过有关LC_MESSAGES
and 的内容sed
,并且知道管道运算符是如何工作的,但我无法弄清楚该命令如何与这些特定选项一起工作。
答案1
LC_MESSAGES=C dpkg-divert --list '*nvidia-340*'
以英语列出与 glob 模式匹配的所有转移*nvidia-340*
,以便输出的形式为“diversion of ... to ... by ...”。
sed -nre 's/^diversion of (.*) to .*/\1/p'
提取“diversion of”和“to”之间的文本,IE转移的文件的名称。-nre
相当于-n -r -e
;-n
禁用自动模式空间输出,因此除非命令请求p
(请参见命令末尾sed
),否则不会输出任何内容;-r
启用扩展正则表达式;并-e
介绍我们要运行的脚本。正则表达式中,^diversion of
匹配行首的“diversion of”(包括空格);(.*)
匹配任意数量的字符,并创建一个匹配组;to .*
匹配“ to ”(包括前导空格和尾随空格)后跟任何字符。这在命令中使用,s
仅将完整文本替换为\1
匹配组的内容(IE“diversion of”和“to”之间的文本)。如果命令匹配,则最终p
打印模式空间。s
xargs -rd'\n' -n1 -- sudo dpkg-divert --remove
sudo dpkg-divert --remove
对上一步输出的每个文件运行,删除相应的转移。
sudo apt --fix-broken install
尝试修复任何损坏的依赖关系。