我的第一篇文章和初学者级别。有没有办法用sed(或任何其他方法)解决这个问题?我想每天操作一个新创建的文件,并替换一些IP和端口出现。
1)我想用A3代替第一次出现“5027,5028”,用A4代替第二次出现。 2)我想用A1替换第一次出现的“5026”,用A2替换第二次出现。
PS。我试图简化示例并将前一行留下版本=“y”或版本=“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作业编辑该文件。
答案 0 :(得分:2)
不要为此尝试使用sed
。可以这样做,但sed
是错误的工具。
请改用awk
。用A3替换第一次出现的“5027,5028”,用A4替换第二次出现。
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
答案 1 :(得分:1)
这可能适合你(GNU Sed):
sed '1,/5027,5028/s/5027,5028/A3/;s/5027,5028/A4/;1,/5026/s/5026/A1/;s/5026/A2/' file