【问题标题】:SED: append after first matchSED:第一次匹配后追加
【发布时间】:2013-09-30 17:49:38
【问题描述】:

有没有办法在第一次匹配后仅使用sed 附加文本?我有这样的东西,但每隔一行插入一次文本:

sed -e '0,/priority/a\exclude = php*' /etc/yum.repos.d/epel.repo

文件

$ cat /etc/yum.repos.d/epel.repo 
[epel]
name=Extra Packages for Enterprise Linux 6 - $basearch
#baseurl=http://download.fedoraproject.org/pub/epel/6/$basearch
mirrorlist=https://mirrors.fedoraproject.org/metalink?repo=epel-6&arch=$basearch
failovermethod=priority
enabled=1
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-EPEL-6
priority=3

[epel-debuginfo]
name=Extra Packages for Enterprise Linux 6 - $basearch - Debug
#baseurl=http://download.fedoraproject.org/pub/epel/6/$basearch/debug
mirrorlist=https://mirrors.fedoraproject.org/metalink?repo=epel-debug-6&arch=$basearch
failovermethod=priority
enabled=0
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-EPEL-6
gpgcheck=1
priority=3

[epel-source]
name=Extra Packages for Enterprise Linux 6 - $basearch - Source
#baseurl=http://download.fedoraproject.org/pub/epel/6/SRPMS
mirrorlist=https://mirrors.fedoraproject.org/metalink?repo=epel-source-6&arch=$basearch
failovermethod=priority
enabled=0
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-EPEL-6
gpgcheck=1
priority=3

更新:

所需的输出 - exclude = php* 应该只在第一个 repo ([epel]) 中:

$ cat /etc/yum.repos.d/epel.repo 
[epel]
name=Extra Packages for Enterprise Linux 6 - $basearch
#baseurl=http://download.fedoraproject.org/pub/epel/6/$basearch
mirrorlist=https://mirrors.fedoraproject.org/metalink?repo=epel-6&arch=$basearch
failovermethod=priority
enabled=1
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-EPEL-6
priority=3
exclude = php*
...

【问题讨论】:

  • 您希望新行在哪里?您显示的命令清楚地在指定范围内的每一行之后添加该行。
  • 我已经更新了我的问题。谢谢

标签: sed


【解决方案1】:

你可以说:

sed '/^priority/{s/.*/&\nexclude = php*/;:a;n;ba}' /etc/yum.repos.d/epel.repo

【讨论】:

  • 很好的标签用法,聪明的解决方案!比我的简单。 +1
  • 你能解释一下这些选项的作用吗;:a;n;ba - 看起来这个命令没有它们也能工作?
  • @HTF 否,如果没有您突出显示的部分,该行将附加到以priority 开头的所有行。见this
  • anadis-mbp:tmp anadi$ sed '/^gpgkey/{s/.*/&\nexclude = php*/;:a;n;ba}' yum1.repo sed: 1: “/^gpgkey/{s/.*/&\nexclu ...”:意外的 EOF(待处理的 })
  • 我在尝试 sed 命令时收到此错误。我正在尝试在 gpgkey=file:/// .... 之后的基本部分下添加行,这恰好是代表定义文件中所有部分的最后一行
【解决方案2】:

除了sed之外的awk解决方案

awk '/^priority/ && !f {$0=$0 RS "nexclude = php*";f=1}1' file

如果搜索到f=0,则添加文本并设置f=1。这可以防止在所有 priority 之后添加文本。

【讨论】:

  • OP 仅在 sed 中提及
  • 我知道,但它总是很适合变化,可能是 OP 不知道 awk 是可能的。加上awk 代码可能比sed 中的代码更容易理解/阅读
【解决方案3】:
sed  '/priority/{x;/1/{x;b};s/^/1/;x;s/.*/&\nexclude = php*/}' file

上面的行可能对你有用。

【讨论】:

    猜你喜欢
    • 2022-01-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-29
    • 1970-01-01
    • 1970-01-01
    • 2022-01-13
    • 1970-01-01
    相关资源
    最近更新 更多