如果要匹配多行,如何使用sed更改文本

如果要匹配多行,如何使用sed更改文本,sed,Sed,我需要对文件进行一些更改,但要匹配多行 我尝试了sed的/name here\n.*版本:.*/name here\n版本:new version/g'file.yaml,但不起作用 这是一个和平的代码从文件 name_here: - name: name-here version: 1.3.2.115 - name: other-name version: 1.3.2.115 - name: final-name version: 1.3.2.115 在我使用sed之后,我希望得

我需要对文件进行一些更改,但要匹配多行

我尝试了sed的/name here\n.*版本:.*/name here\n版本:new version/g'file.yaml,但不起作用

这是一个和平的代码从文件

name_here:
- name: name-here
  version: 1.3.2.115
- name: other-name
  version: 1.3.2.115
- name: final-name
  version: 1.3.2.115
在我使用sed之后,我希望得到如下结果:

name_here:
- name: name-here
  version: new-version
- name: other-name
  version: 1.3.2.115
- name: final-name
  version: 1.3.2.115

由于数据的结构,您可以使用正则表达式范围来预测数据,而不是尝试在sed中执行多行操作。实际上,您应该使用适当的YAML工具来执行此操作

试一试

这对awk来说是一件容易的工作

如果格式化很重要,则应执行以下操作:

awk 'f && /version/ {sub(/: .*/, ": new version");f=0} /name-here/ {f=1} 1' file
name_here:
- name: name-here
  version: new version
- name: other-name
  version: 1.3.2.115
- name: final-name
  version: 1.3.2.115
使用GNU时:

sed -r '/- name: name-here$/{n; s/(version: ).*/\1new-version/ }' file
输出:

name_here: - name: name-here version: new-version - name: other-name version: 1.3.2.115 - name: final-name version: 1.3.2.115
请参阅:man sed

这可能适用于GNU sed:

sed '/name-here/{:a;n;/version:/s/:.*/: new-version/;Ta}' file
在此处查找包含名称的行,然后修改包含版本的第一行:

如果只想替换文件中的版本:一次,请使用:

sed '/name-here/{:a;n;/version:/s/:.*/: new-version/;Ta;:b;n;bb}' file

awk更适合这份工作。sed是强制性的吗?
sed '/name-here/{:a;n;/version:/s/:.*/: new-version/;Ta}' file
sed '/name-here/{:a;n;/version:/s/:.*/: new-version/;Ta;:b;n;bb}' file