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

Ali*_*deh 6 command-line repository sed text-processing

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

deb http://downloads.sourceforge.net/project/xenlism-wildfire/repo deb/ 
Run Code Online (Sandbox Code Playgroud)

我想通过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'
Run Code Online (Sandbox Code Playgroud)

我猜是这个错误:之后的符号http,但我该如何解决呢?

use*_*274 9

你可以使用任何*符号分隔查找/替换字符串不与符号冲突的字符串,只要你使用它始终如一,例如:

sudo sed 's#deb http://downloads.sourceforge.net/project/xenlism-wildfire/repo deb/##g' /etc/apt/sources.list
Run Code Online (Sandbox Code Playgroud)

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

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


jan*_*nos 6

像这样运行:

sudo sed -i '\%^deb http://downloads.sourceforge.net/project/xenlism-wildfire/repo deb%d' /etc/apt/sources.list
Run Code Online (Sandbox Code Playgroud)

我修复的问题:

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

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

sudo sed -i '/xenlism-wildfire/d' /etc/apt/sources.list
Run Code Online (Sandbox Code Playgroud)

因为在这个例子中没有/,我可以使用更简单的/.../过滤器。

(感谢@steeldriver的改进想法。)