我的文件名很多:我只想替换第一个
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,因为动态值 您能建议我如何用我的语法仅替换第一个吗?
答案 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
标志可将.*
限制在一行内。