如何用sed替换第一次出现?

use*_*697 5 bash awk sed

我有很多名字的文件:我只想替换第一个

sed -i "s/\(name:\).*/\1 ${NEW_VALUE}/" ./myFile

Input
-  martin:
    name: Martin D'vloper
    job: Developer
    skills:
      - python
      - perl
      - pascal
-  tabitha:
    name: Tabitha Bitumen
    job: Developer
    skills:
      - lisp
      - fortran
      - erlang
Run Code Online (Sandbox Code Playgroud)

输出仅更改名字 Martin D'vloper

-  martin:
        name: NEW VALUE!!!
        job: Developer
        skills:
          - python
          - perl
          - pascal
    -  tabitha:
        name: Tabitha Bitumen
        job: Developer
        skills:
          - lisp
          - fortran
          - erlang
Run Code Online (Sandbox Code Playgroud)

它改变了所有的名字

我看到了一些不同语法的东西

sed '0,/pattern/s/pattern/replacement/' filename
Run Code Online (Sandbox Code Playgroud)

但我无法将 sed 更改为此,因为动态值您能否建议我如何仅用我的语法替换第一个?

rAl*_*len 6

这应该做你想要的:

sed -i "0,/name:/{s/name:.*/name: ${NEW_VALUE}/}" ./myFile
Run Code Online (Sandbox Code Playgroud)

它找到第一次出现的位置name:,然后进行替换,即将name: followed by any characters(. * 表示任何字符序列)替换为“ name: ${NEW_VALUE}”,其中NEW_VALUE是示例中的动态变量。

来自 sed 人

0,地址2

从“匹配第一个地址”状态开始,直到找到 addr2。这与 1,addr2 类似,不同之处在于,如果 addr2 与输入的第一行匹配,则 0,addr2 形式将位于其范围的末尾,而 1,addr2 形式仍将位于其范围的开头。仅当 addr2 是正则表达式时才有效。

  • 为什么我们需要第一个 /name/{ ? (2认同)