【问题标题】:sed + match line and add word on the first string in linesed + 匹配行并在行中的第一个字符串上添加单词
【发布时间】:2011-04-05 17:33:31
【问题描述】:

我有以下文件

    more file
    machine1  network netmask  broadcast

如何在具有“网络掩码广播”字样的行中的第一个字之后添加“_NAME”?

remark sed 也需要只匹配“网络掩码广播”,然后在该行的第一个单词中添加_NAME

示例:执行 sed 命令后我需要得到什么

   machine1_NAME  network netmask  broadcast

【问题讨论】:

    标签: sed


    【解决方案1】:

    这应该可行,因为我们没有使用 g 修饰符,它每行只会匹配一次

    sed -e 's/^[^ ]*\>/&_NAME/'
    

    它将非空格字符匹配到第一个单词边界,将其替换为自身并附加_NAME。如前所述,如果没有 g 修饰符,它将每行只匹配一次,如果行上有前导空格,只需删除第一个 ^-anchor。

    编辑
    你只希望它在特定的行上匹配,所以这里是:

    sed -e '/network netmask broadcast$/s/^[^ ]*\>/&_NAME/'
    

    第一部分是一个选择器,它确保只在network netmask broadcast 结束的行上执行替换。要让它与这些单词匹配任何行,只需删除$-anchor,并将*(空格星号)添加到空格以使其灵活。但你可能已经知道了.. :)

    【讨论】:

      【解决方案2】:
      sed '/network.*netmask.*broadcast/s|^\([ \t]*\)\(.[^ \t]*\) |\1\2_NAME|' file
      

      【讨论】:

      • @roe:sed 的某些版本不需要-e
      • 对不起,我只是想提供帮助,-e 永远不会错,但不使用它很可能是不正确的,即使用它几乎总是更安全。我的错。
      • @Dennis;是的,但不幸的是不是全部。我很确定 Solaris sed 确实需要它,并且其中没有提到 GNU sed。
      • fyi 我认为 -e 仅当您在命令行上提供多个指令时才需要。当只有 1 条指令时,sed 可以在没有 'e' 的情况下弄清楚这一点
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-03-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多