【问题标题】:Substitution option: s in sed command [duplicate]替换选项:sed 命令中的 s [重复]
【发布时间】:2014-05-31 16:34:35
【问题描述】:

我在文件中使用 sed 命令进行替换。 假设我的 file1 是:

10
11
10
11

然后我想将file1中的第一个“10”替换为“12”,然后转储到file2。 file2 应该是:

12
11
10
11

我试过这个命令:

sed 's/10/12/' file1 >file2

但它也改变了第二个“10”。那么,我该如何编写 sed 命令来做到这一点呢?

【问题讨论】:

    标签: sed


    【解决方案1】:

    如果您可以使用 awk 代替 sed,您可以像这样拥有更多控制权:

    awk '!changed && /10/ { sub(/10/, "12"); changed = 1}1' file1
    12
    11
    10
    11
    

    【讨论】:

      【解决方案2】:

      尝试:

      sed '0,/10/s/10/12/' file1 >file2
      

      【讨论】:

      • 这将完成这项工作,但您应该解释它的作用以及它完成工作的原因。
      【解决方案3】:

      就像 GriffinG 说的,你可以这样做:

      sed '0,/10/ s/10/12/' file1 > file2
      

      开头的0,/10/ 设置了以下替换命令的界限。它说从第 0 行(第一行)开始,一直到与模式 /10/ 匹配的一行。因此,在第一次匹配之后,sed 将停止处理该替换。

      【讨论】:

      • 0,/.../ 仅适用于 GNU sed
      【解决方案4】:

      如果您没有 GNU sed,请尝试:

      echo | cat - file | sed '1,/10/s/10/12/; 1d'
      

      sed '1,/10/s/10/12/; 1d' << EOF
      
      $(cat file)
      EOF
      

      或在bash / ksh93

      sed '1,/10/s/10/12/; 1d' <(echo; cat file)
      

      GNU sed 知道0,/10/,因此不需要额外的空行

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-05-29
        • 2013-06-11
        • 2012-07-10
        • 1970-01-01
        • 2021-07-06
        • 1970-01-01
        • 2018-09-14
        • 2021-08-14
        相关资源
        最近更新 更多