使用 sed 将第 1 次出现的行替换为 Value1,将第 2 次出现的行替换为 Value2

Replace 1st Occurence line with Value1 and 2nd Occurence line with Value2 using sed

我遇到了必须将第一次出现的关键字{以及整行}替换为值 x 并将第二次出现的关键字替换为值 Y 的要求。例如

  1. sudo docker 推送 IP:PORT/ABC:1

  2. sudo docker 推送 IP:PORT/XYZ:1

在上述情况下,我会 select 使用关键字“sudo docker push”并将第一次出现的整行替换为 sudo docker push IP1:PORT/ABC:1 并将第二次出现的整行替换为 sudo docker push IP2:PORT/ABC:1 .

我尝试了以下组合,但直到现在都没有奏效:

sed -i "s,old-word,new-word," file-name
sed -i "<occurence-number> s,old-word,new-word,g" file-name
sed -i " s,old-word,new-word,<occurence-number>g" file-name
sed "<occurence-number>,old-word,{s,old-word,new-word,}" file-name

示例不清楚...最好提供完整的字符串示例,说明您拥有的内容和您想要的结果。 但也许您正在寻找“sudo docker push”并试图仅替换这一部分,而不是整行。 您可以将正则表达式用于 select 行的其余部分,例如:

sed -i 's/sudo docker push.*/sudo docker push IP:PORT/XYZ:1/'

或者只是提供更清晰的来源和结果字符串示例。

如果你允许我重新表述你的问题:

名为 file-name 的文件包含 v.gr。

some lines
...
sudo docker push IP:PORT/ABC:1
more lines
...
sudo docker push IP:PORT/ABC:1
and so on
...

必须改成:

some lines
...
sudo docker push IP1:PORT/ABC:1
more lines
...
sudo docker push IP2:PORT/ABC:1
and so on
...

困难在于同一个键的两次出现必须触发两个不同的变化。

试试这个脚本:

#!/bin/bash

key="sudo docker push"
#Caution: "/" inside the two strings below must be escaped as "\/"
change1="sudo docker push IP1:PORT\/ABC:1"
change2="sudo docker push IP2:PORT\/ABC:1"

sed -i "
  0,/$key/s/^.*$key.*$/FIRST-OCCURENCE/
  0,/$key/s/^.*$key.*$/$change2/
  /FIRST-OCCURENCE/s//$change1/
" file-name

sed可以,但是很不方便:

sed '/OLD/{s|.*|NEW-1|; :label; n; /OLD/s|.*|NEW-2|; b label;}'

根据您的 sed 版本,您可能必须将 :labelb label 之后的 ; 替换为文字换行符才能使其正常工作。

对于输入...

a b c
d OLD e
f g h
i OLD k
l m n

…这会打印…

a b c
NEW-1
f g h
NEW-2
l m n

为简单起见,您可能希望使用 awk

awk '/OLD/ {++c; if (c==1) {[=13=]="NEW-1"} else {[=13=]="NEW-2"}} 1'

awk 'BEGIN {a[1]="NEW-1"; a[2]="NEW-2"} /OLD/ {[=14=]=a[++c]} 1'

试试这个

sed -i "/old-word/c new-word" file-name