0

我在这里的第一篇文章和初学者级别。有没有办法用 sed (或任何其他方式)解决这个问题?我想每天操作一个新创建的文件并替换一些 IP 和端口出现。

1)我想用 A3 替换第一次出现的“5027,5028”,用 A4 替换第二次出现的“5027,5028”。2)我想用 A1 替换第一次出现的“5026”,用 A2 替换第二次出现的“5026”。

PS。我试图简化示例,并在前面的行中保留 version="y" 或 version="x",这可能有助于区分出现的情况。(第一个 x 和 y 版本对是主要连接,另外两个是辅助连接)。

输入文件:

version="x"
commaSeparatedList="5027,5028"`
version="y"
commaSeparatedList="5026"
version="x"
commaSeparatedList="5027,5028"
version="y"
commaSeparatedList="5026"

编辑文件:

version="1.4.1-12"
commaSeparatedList="A3"
version="1.3.0"
commaSeparatedList="A1"
version="1.4.1-12"
commaSeparatedList="A4"
version="1.3.0"
commaSeparatedList="A2"

对不起,我有几分钟的编辑恐惧。希望现在看起来更容易理解。我基本上是在每晚部署的系统上接收这个文件,我想在它开始确保连接正常之前使用 cron 作业编辑这个文件。

4

2 回答 2

2

不要费心尝试使用sed它。可以做到,但sed工具不对。

改为使用awk。用 A3 替换第一次出现的“5027,5028”,用 A4 替换第二次出现的“5027,5028”。

awk '/5027,5028/ && count < 2 { if( count ++ ) repl="A4"; else repl="A3";
    sub( "5027,5028", repl)} 1' input

第二个替换留作练习。基本上是一样的,你可以运行两次 awk 或者只是在上面添加额外的子句。

要覆盖原始文件,请使用 shell 重定向:

awk ... input > tmpfile && mv tmpfile input 
于 2013-02-18T14:22:41.047 回答
1

这可能对您有用(GNU Sed):

sed '1,/5027,5028/s/5027,5028/A3/;s/5027,5028/A4/;1,/5026/s/5026/A1/;s/5026/A2/' file
于 2013-02-18T15:01:38.553 回答