如何使用 sed 从存储库中删除一行

如何使用 sed 从存储库中删除一行

我的/etc/apt/sources.list包含这一行:

deb http://downloads.sourceforge.net/project/xenlism-wildfire/repo deb/ 

我想通过sed命令行删除该行,因此我尝试了此代码但返回错误!

$ sudo sed 's:deb http://downloads.sourceforge.net/project/xenlism-wildfire/repo deb/::g' /etc/apt/sources.list
sed: -e expression #1, char 75: unknown option to `s'

:我猜测是后面的符号http导致了这个错误,但是我该如何修复它呢?

答案1

您可以使用任何*符号来分隔搜索/替换字符串,只要不与符号冲突字符串,只要您始终如一地使用它,例如:

sudo sed 's#deb http://downloads.sourceforge.net/project/xenlism-wildfire/repo deb/##g' /etc/apt/sources.list

这减少了对有问题的字符进行转义的需要(可以使用\转义符来完成)。

*我确信存在例外,特别是如果使用旧版本sed,但我不知道有任何限制。

答案2

像这样运行:

sudo sed -i '\%^deb http://downloads.sourceforge.net/project/xenlism-wildfire/repo deb%d' /etc/apt/sources.list

我修复的问题:

  • 使用-i标志来就地修改文件。如果没有该标志,命令只会将输出打印sed到屏幕上,而不会更新文件。
  • 我没有使用 来s///用空字符串替换该行,而是使用命令d来删除该行。
  • 对于模式匹配,/.../我使用了而不是\%...%,因为%不会出现在模式中。使用/,所有出现的/都必须被替换。

请注意,更简单的过滤器可能就足够了。例如,如果您知道xenlist-wildfire在文件中是唯一的,那么这个更简单的命令也可以工作:

sudo sed -i '/xenlism-wildfire/d' /etc/apt/sources.list

由于此示例中没有/,我可以使用更简单的/.../过滤器。

(感谢@steeldriver以了解改进想法。

相关内容