我有一个文件 config.txt,其中包含如下行
$ cat config.txt | head -n 3
<a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="1177212229292875287073727327702027202424252020737329742170222575757573247229742572512028233f2027293f223f25" rel="noreferrer noopener nofollow">[email protected]</a>:26601
<a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="94f6f1adf0a3a1a3f5f7f1f1a5f2a1f6a1a3a7f1f7a5acf0a5f1a4a1a2a1a0a6f6f7a6aca6f6f1a6a7d4a5a2adbaa5a3a6baa1a2baa3a3" rel="noreferrer noopener nofollow">[email protected]</a>:26604
<a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="432777732620717322737b7377757b252027767a7576777a70277a73772677277670752025767475740372736d72717a6d7273726d70" rel="noreferrer noopener nofollow">[email protected]</a>:26607
$ cat ip.txt | head -n 3
10.0.4.5
10.3.5.6
10.3.5.8
我想分别用 ip.txt 文件中的 IP 替换 config.txt 上的 IP 地址
预期输出是
<a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="b0d68083888889d489d1d2d3d286d18186818585848181d2d288d580d18384d4d4d4d285d388d584d3f081809e809e849e85" rel="noreferrer noopener nofollow">[email protected]</a>:26601
<a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="5a383f633e6d6f6d3b393f3f6b3c6f386f6d693f396b623e6b3f6a6f6c6f6e683839686268383f68691a6b6a7469746f746c" rel="noreferrer noopener nofollow">[email protected]</a>:26604
<a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="8de9b9bde8eebfbdecbdb5bdb9bbb5ebeee9b8b4bbb8b9b4bee9b4bdb9e8b9e9b8bebbeeebb8babbbacdbcbda3bea3b8a3b5" rel="noreferrer noopener nofollow">[email protected]</a>:26607
由于配置文件中的 IP 是动态的,因此我需要在 sed 中使用正则表达式来替换 IP。 举个例子:
$ echo "<a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="c2a4f2f1fafafba6fba3a0a1a0f4a3f3f4f3f7f7f6f3f3a0a0faa7f2a3f1f6a6a6a6a0f7a1faa7f6a182f3fbf0ecf3f4faecf1ecf6" rel="noreferrer noopener nofollow">[email protected]</a>:26601" | sed "s/*@\+:*/*@10.0.4.5:*/g"
但它没有更新 IP。我对脚本中的正则表达式非常陌生。请帮忙!
最佳答案
好吧,在这种情况下可以使用sed
和正则表达式。您可以首先加入文件,然后然后使用正则表达式来打乱行:
paste config.txt ip.txt | sed 's/@[^:]*\(.*\)\t\(.*\)/@\2\1/'
请注意,sed
仅在单行上下文中工作。但是正则表达式不是“动态”的,如果配置文件中的IP是动态的
那么你应该使用比正则表达式“更多”的东西,更好的是支持映射和内部状态的完整编程语言,例如awk
以及 perl
或 python
。
关于sed 中的正则表达式替换特定字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69357768/