Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/image/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
用sed替换第n个匹配行_Sed - Fatal编程技术网

用sed替换第n个匹配行

用sed替换第n个匹配行,sed,Sed,我有一个脚本,输出大约50行,当我试图只替换其中一行时,大约有五行匹配 例如: ... metadata name: A ... spec: - labels: ... name: B name: C - labels: ... name: D name: E 我试图使用sed将整个“name:B”替换为“name:{firstVar}”,并将“name:D”替换为“name:{secondVar}”。我知道我可以搜索整行“name:B”或“name:D”,但它们并不

我有一个脚本,输出大约50行,当我试图只替换其中一行时,大约有五行匹配

例如:

...
metadata
 name: A
...
spec:
- labels:
...
    name: B
  name: C
- labels:
...
    name: D
  name: E
我试图使用sed将整个“name:B”替换为“name:{firstVar}”,并将“name:D”替换为“name:{secondVar}”。我知道我可以搜索整行“name:B”或“name:D”,但它们并不总是相同的,可以被其他人更改。唯一一致的是它们的位置。因此,我希望能够替换第二个和第四个匹配项,但每当我尝试“s/name:.*/name:{firstVar}/2”或类似的内容时,它都不起作用,或者它将替换所有匹配项

任何帮助都将不胜感激。

这里是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
以下是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
这可能适用于您(GNU-sed):

在shell中设置变量,然后在模式匹配替换中使用它们作为替换。替换命令中的正整数标志将替换模式空间中的数字模式。
-z
选项将整个文件拖到内存中,因此模式空间包含整个文件。

这可能适用于您(GNU-sed):


在shell中设置变量,然后在模式匹配替换中使用它们作为替换。替换命令中的正整数标志将替换模式空间中的数字模式。
-z
选项将整个文件拖到内存中,因此模式空间包含整个文件。

哎呀,我使用了A和B而不是C和D,但修复它只是一个练习。我并没有考虑awk。我对塞德非常着迷。我会尝试一下,看看它是如何与我正在尝试的工作配合的。所以,看看这个,如果有任何东西与“a”或“B”匹配,你就会替换它。不幸的是,对于我正在做的事情,它并不总是A或B。这些名称是完全动态的。这就是为什么我希望替换键“name:”的第二个和第四个匹配项,而不仅仅是该值。谢谢你。接下来我们将进一步研究awk,并更新解决方案。哎呀,我使用了A和B而不是C和D,但修复它只是一个练习。没有考虑awk。我对塞德非常着迷。我会尝试一下,看看它是如何与我正在尝试的工作配合的。所以,看看这个,如果有任何东西与“a”或“B”匹配,你就会替换它。不幸的是,对于我正在做的事情,它并不总是A或B。这些名称是完全动态的。这就是为什么我希望替换键“name:”的第二个和第四个匹配项,而不仅仅是该值。谢谢你。我们将进一步研究awk以及更新的解决方案。这看起来像YAML。你试过使用YAML解析器吗?这看起来像YAML。您是否尝试过使用YAML解析器?