【问题标题】:Sed: modifying only some linesSed:只修改一些行
【发布时间】:2020-04-11 17:44:42
【问题描述】:

在我的 /etc/apt/sources.list 中,我想使用 sed 将“contrib non-free”附加到所有非注释行。

这是我的表达:

sed -n -i '/^\([^#].*main\)/{s/main/main contrib non-free/p}' /etc/apt/sources.list

它做了我想要的,但它也删除了所有其他行。

我做错了什么?

【问题讨论】:

  • 只需从您的sed 命令中删除-n 并删除/p 以使其成为sed -i '/^\([^#].*main\)/s/main/& contrib non-free/' /etc/apt/sources.list
  • 当您想像使用 grep 一样过滤文件时,通常只在 sed 中使用 -n 选项。 Sed 在获取下一行之前隐式打印模式空间。替换命令中的pPp 标志允许用户显式打印全部或部分模式空间。

标签: regex shell sed


【解决方案1】:

问题在于您的命令中的选项-n 会抑制正常输出。您需要删除 -n 并从替换中删除 p 选项以避免重复打印匹配行。

这个命令应该对你有用:

sed -i '/^\([^#].*main\)/s/main/& contrib non-free/' /etc/apt/sources.list

【讨论】:

  • 这将添加非免费的 contrib,即使它已经存在于行中。请尝试以下操作:sed -i '/^\([^#].*main\)*$/s/main/& contrib non-free/' /etc/apt/sources.list
  • @spacebiker:问的问题不同,contrib non-free 的现有行不是要求的一部分。否则很容易处理。
【解决方案2】:

@anubhava 接受的答案(感谢您的代码,因为它为我指明了正确的方向)将添加非免费的 contrib,即使它已经存在于行中。请尝试以下操作:

sed -i '/^\([^#].*main\)*$/s/main/& contrib non-free/' /etc/apt/sources.list

【讨论】:

    猜你喜欢
    • 2019-07-12
    • 1970-01-01
    • 1970-01-01
    • 2021-07-22
    • 1970-01-01
    • 1970-01-01
    • 2014-02-02
    • 2023-04-09
    • 1970-01-01
    相关资源
    最近更新 更多