使用 sed 将第 1 次出现的行替换为 Value1,将第 2 次出现的行替换为 Value2
Replace 1st Occurence line with Value1 and 2nd Occurence line with Value2 using sed
我遇到了必须将第一次出现的关键字{以及整行}替换为值 x 并将第二次出现的关键字替换为值 Y 的要求。例如
sudo docker 推送 IP:PORT/ABC:1
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
版本,您可能必须将 :label
和 b 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
我遇到了必须将第一次出现的关键字{以及整行}替换为值 x 并将第二次出现的关键字替换为值 Y 的要求。例如
sudo docker 推送 IP:PORT/ABC:1
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
版本,您可能必须将 :label
和 b 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