用sed替换第n个匹配行

时间:2019-03-06 15:55:36

标签: sed

我有一个脚本,可以输出大约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”或类似的方法都无法正常工作,否则它将替换所有比赛

任何帮助将不胜感激。

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选项将整个文件插入到内存中,因此模式空间包含整个文件。