如何用sed代替首次出现?

时间:2019-02-12 12:43:49

标签: 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

仅更改名字Martin D'vloper的输出

-  martin:
        name: NEW VALUE!!!
        job: Developer
        skills:
          - python
          - perl
          - pascal
    -  tabitha:
        name: Tabitha Bitumen
        job: Developer
        skills:
          - lisp
          - fortran
          - erlang

它更改了所有名称

我看到了使用不同语法的内容

sed '0,/pattern/s/pattern/replacement/' filename

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

3 个答案:

答案 0 :(得分:2)

这应该做您想要的:

sed -i "0,/name:/{s/name:.*/name: ${NEW_VALUE}/}" ./myFile

它先找到name:,然后进行替换,即替换'name: followed by any characters'(。 *表示任何字符序列)和' name: ${NEW_VALUE} ',其中 NEW_VALUE 是示例中的动态变量。

来自男人sed

  

0,addr2

     

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

答案 1 :(得分:1)

如果您对awk表示满意,请尝试执行以下操作。

awk '/name/ && ++count==1{sub(/name:.*/,"name: NEW VALUE!!!")} 1'  Input_file

如果您有一个shell变量,并且想要将其值添加到awk代码中,请尝试执行以下操作。

val="new_vaue"
awk -v value="$val" '/name/ && ++count==1{sub(/name:.*/,"name: "value)} 1'  Input_file

如果要将输出保存到Input_file本身,请在上述代码后附加> temp_file && mv temp_file Input_file

答案 2 :(得分:0)

这可能对您有用(GNU sed):

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

匹配name:,替换新值,然后读取并打印文件的其余部分。

或替代:

sed -z -i 's/\(name:\).*/\1 '"${NEW_VALUE}"'/M' file

替换命令的M标志可将.*限制在一行内。