Bash 使用sed替换整行的第二个实例

Bash 使用sed替换整行的第二个实例,bash,sed,Bash,Sed,我正在编写一个bash脚本,我想找到一个特定的字符串并替换整行,但是在第二次出现时 例如: # randomtext 9876 randomtext 9999 我想用“randomtext 123”替换第二次出现的“randomtext”。因此,最终输出应如下所示: # randomtext 9876 randomtext 123 我在网上找到了一个与我想要的非常相似的解决方案,但我不确定如何使用它 sed -i "0,/^PATTERN/ s/^PATTERN=.*$/PATTERN=XY

我正在编写一个bash脚本,我想找到一个特定的字符串并替换整行,但是在第二次出现时

例如:

# randomtext 9876
randomtext 9999
我想用“randomtext 123”替换第二次出现的“randomtext”。因此,最终输出应如下所示:

# randomtext 9876
randomtext 123
我在网上找到了一个与我想要的非常相似的解决方案,但我不确定如何使用它

sed -i "0,/^PATTERN/ s/^PATTERN=.*$/PATTERN=XY/" test.txt

您的需求不明确,您的示例输入/输出也没有帮助,但考虑到以下输入文件:

$ cat file
# randomtext 9876
foo
randomtext 9999
bar
randomtext 3
要替换第二次出现的随机文本,请执行以下操作:

$ awk '{print (/randomtext/ && (++c==2) ? "randomtext 123" : $0)}' file
# randomtext 9876
foo
randomtext 123
bar
randomtext 3
$ awk '{print (/^[^#]*randomtext/ ? "randomtext 123" : $0)}' file
# randomtext 9876
foo
randomtext 123
bar
randomtext 123
$ awk '{print (/^[^#]*randomtext/ && (++c==1) ? "randomtext 123" : $0)}' file
# randomtext 9876
foo
randomtext 123
bar
randomtext 3
要替换所有未注释的随机文本,请执行以下操作:

$ awk '{print (/randomtext/ && (++c==2) ? "randomtext 123" : $0)}' file
# randomtext 9876
foo
randomtext 123
bar
randomtext 3
$ awk '{print (/^[^#]*randomtext/ ? "randomtext 123" : $0)}' file
# randomtext 9876
foo
randomtext 123
bar
randomtext 123
$ awk '{print (/^[^#]*randomtext/ && (++c==1) ? "randomtext 123" : $0)}' file
# randomtext 9876
foo
randomtext 123
bar
randomtext 3
要替换第一个未注释的随机文本,请执行以下操作:

$ awk '{print (/randomtext/ && (++c==2) ? "randomtext 123" : $0)}' file
# randomtext 9876
foo
randomtext 123
bar
randomtext 3
$ awk '{print (/^[^#]*randomtext/ ? "randomtext 123" : $0)}' file
# randomtext 9876
foo
randomtext 123
bar
randomtext 123
$ awk '{print (/^[^#]*randomtext/ && (++c==1) ? "randomtext 123" : $0)}' file
# randomtext 9876
foo
randomtext 123
bar
randomtext 3

您的需求不明确,您的示例输入/输出也没有帮助,但考虑到以下输入文件:

$ cat file
# randomtext 9876
foo
randomtext 9999
bar
randomtext 3
要替换第二次出现的随机文本,请执行以下操作:

$ awk '{print (/randomtext/ && (++c==2) ? "randomtext 123" : $0)}' file
# randomtext 9876
foo
randomtext 123
bar
randomtext 3
$ awk '{print (/^[^#]*randomtext/ ? "randomtext 123" : $0)}' file
# randomtext 9876
foo
randomtext 123
bar
randomtext 123
$ awk '{print (/^[^#]*randomtext/ && (++c==1) ? "randomtext 123" : $0)}' file
# randomtext 9876
foo
randomtext 123
bar
randomtext 3
要替换所有未注释的随机文本,请执行以下操作:

$ awk '{print (/randomtext/ && (++c==2) ? "randomtext 123" : $0)}' file
# randomtext 9876
foo
randomtext 123
bar
randomtext 3
$ awk '{print (/^[^#]*randomtext/ ? "randomtext 123" : $0)}' file
# randomtext 9876
foo
randomtext 123
bar
randomtext 123
$ awk '{print (/^[^#]*randomtext/ && (++c==1) ? "randomtext 123" : $0)}' file
# randomtext 9876
foo
randomtext 123
bar
randomtext 3
要替换第一个未注释的随机文本,请执行以下操作:

$ awk '{print (/randomtext/ && (++c==2) ? "randomtext 123" : $0)}' file
# randomtext 9876
foo
randomtext 123
bar
randomtext 3
$ awk '{print (/^[^#]*randomtext/ ? "randomtext 123" : $0)}' file
# randomtext 9876
foo
randomtext 123
bar
randomtext 123
$ awk '{print (/^[^#]*randomtext/ && (++c==1) ? "randomtext 123" : $0)}' file
# randomtext 9876
foo
randomtext 123
bar
randomtext 3

您想只替换第二个事件,还是想跳过第一个事件并更改其余的事件?我想只替换第二个事件,还是只替换未注释的事件?噢,这确实有区别吗?我只想替换未注释的一个。因为在这个文件中,同一个单词只有两次出现。但是其中一个是注释的,另一个是未注释的。您想只替换第二个事件,还是跳过第一个事件并更改其余的?我只替换第二个事件,还是只替换未注释的事件?哦,这确实有区别吗?我只想替换未注释的一个。因为在这个文件中,同一个单词只有两次出现。但是一个是有注释的,一个是没有注释的。谢谢你的解释!如果我想对文件进行更改而不是打印出来,该如何使用awk进行更改?与sed-i类似。使用任何UNIX命令,
cmd
,要更改原始文件,只需执行
cmd file>tmp&&mv tmp file
。这就是GNU在使用
sed-i'script'文件
时在后台所做的一切,它可以帮助您避免键入
sed'script'文件>tmp&&mv tmp文件
。使用GNU awk 4.*您可以执行
awk-i in place'script'文件
,而不必键入额外的几个字符
awk'script'文件>tmp和&mv tmp文件
。感谢您的解释!如果我想对文件进行更改而不是打印出来,该如何使用awk进行更改?与sed-i类似。使用任何UNIX命令,
cmd
,要更改原始文件,只需执行
cmd file>tmp&&mv tmp file
。这就是GNU在使用
sed-i'script'文件
时在后台所做的一切,它可以帮助您避免键入
sed'script'文件>tmp&&mv tmp文件
。使用GNU awk 4.*您可以执行
awk-i in place'script'文件
,而不必键入几个额外字符
awk'script'文件>tmp和mv tmp文件