我有一个脚本,可以输出大约50行,当我尝试只替换其中的一行时,大约有5行匹配。
示例:
...
metadata
name: A
...
spec:
- labels:
...
name: B
name: C
- labels:
...
name: D
name: E
我正在尝试使用sed将整个“名称:B”替换为“名称:{firstVar}”,将“名称:D”替换为“名称:{secondVar}”。我知道我可以只搜索整行“名称:B”或“名称:D”,但是它们并不总是相同的,可以被其他人更改。唯一一致的是它们的位置。因此,我希望能够替换第二场和第四场比赛,但是任何时候我尝试使用“ s / name:。* / name:{firstVar} / 2”或类似的方法都无法正常工作,否则它将替换所有比赛
任何帮助将不胜感激。
答案 0 :(得分:0)
这是awk中的一个:
$ awk '
BEGIN {
a[2]="firstVar" # define the pairs
a[4]="secondVar"
}
$1=="name:" { # search for match
sub($1 " " $2,$1 " " ((++i in a)?a[i]:$2),$0) # replace
}1' file
输出:
...
metadata
name: A
...
spec:
- labels:
...
name: firstVar
name: C
- labels:
...
name: secondVar
name: E
答案 1 :(得分:0)
这可能对您有用(GNU sed):
second="firstVar" fourth="secondVar"
sed -z 's/\(name:\s*\)[^\n]*/\1'"$second"'/2;s//\1'"$fourth"'/4' file
在外壳中设置变量,然后将其用作模式匹配替换中的替换。替换命令中的正整数标志将替换模式空间中的该数字模式。 -z
选项将整个文件插入到内存中,因此模式空间包含整个文件。