sed 中的正则表达式替换特定字符串

标签 regex sed

我有一个文件 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 以及 perlpython

关于sed 中的正则表达式替换特定字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69357768/

相关文章:

linux - 如何替换 Linux 输出中的列数据 - 可能使用 awk sed 等

bash - 删除字符串最后一个大小写之前的所有行

regex - 使用 sed 在特定行后添加换行符

linux - 更改目录中数十亿个文件的后缀和前缀

ios - iOS上的正则表达式错误

Java正则表达式抛出错误

java - 正则表达式匹配最后一部分的问题

python - 使用正则表达式将大写缩写替换为相同字母但添加标点符号和空格

java - 在字符串中多次匹配某个模式

linux - 如何删除包含重复单词的行?