sed:使用另一个文件的内容修改文件

时间:2011-12-12 01:02:35

标签: bash shell sed posix

我有一个脚本将ip地址写入文件ip.txt

我想用ip.txt中的ip替换html文件中的ip地址。

我有一个与ip地址匹配的sed正则表达式,我想用ip.txt的内容替换这个匹配的文本:

"s/\([0-9]\{1,3\}\.\)\{3\}[0-9]\{1,3\}//g"

如何让sed提取ip.txt的内容并将其放入s/<search>/<*HERE*>/g表达式?

有没有比这更好的方法?

sed -e "s/\([0-9]\{1,3\}\.\)\{3\}[0-9]\{1,3\}/"`cat ip.txt`"/g"

3 个答案:

答案 0 :(得分:4)

没有太大改进,但你可以替换

"`cat ip.txt`"

$(<ip_txt)

将替换为文件内容,效率略高于使用cat

答案 1 :(得分:3)

在运行sed命令之前,您可以将IP读入shell变量。假设ip.txt是仅包含IP地址的单行:

read -r ip < ip.txt
sed -e "s/\([0-9]\{1,3\}\.\)\{3\}[0-9]\{1,3\}/$ip/g" file.html > newfile.html
mv newfile.html file.html

答案 2 :(得分:2)

POSIX sed(因此大多数可用的sed实现)支持r file命令在匹配行时读取文件。只要您不介意在IP地址的任何一侧包含换行符的结果,您就可以使用r轻松完成。描述说:

  

[1addr] r rfile

     

如前所述,将 rfile 的内容复制到标准输出。如果 rfile 不存在或无法读取,则应将其视为空文件,不会导致错误。

这意味着您没有机会编辑文件的内容,而如果将其读入模式空间或保留空间,则可以修改数据。

在这种情况下,您的命令行替换就像您可以做的一样好。