如何用sed将匹配字符串替换为文件内容而非追加到行后?
要实现用文件内容直接替换PLACE_HOLDER而不是追加到行后,给你两个实用方法:
方法一:sed结合命令替换(适合中小文件)
这个方案直接把文件内容转义后作为替换值,避免sed解析出错:
sed "s/PLACE_HOLDER/$(sed 's/[\/&]/\\&/g' input.txt)/" <<< '<div>PLACE_HOLDER</div>'
执行后输出:
<div>abc</div>
其中sed 's/[\/&]/\\&/g' input.txt是为了转义文件里的/和&(这俩是sed替换的特殊字符),防止替换时出现语法错误。
方法二:awk处理(适合大文件)
如果你的input.txt是大文件,用变量存内容太占内存,就用awk逐行读取文件内容再替换:
awk ' BEGIN { while ((getline line < "input.txt") > 0) { content = content line ORS } sub(/'$ORS'$/, "", content) close("input.txt") } {gsub(/PLACE_HOLDER/, content); print} ' <<< '<div>PLACE_HOLDER</div>'
执行后同样得到目标输出:
<div>abc</div>
之前你的sed命令之所以会把内容追加到行后,是因为r命令的特性就是把文件内容追加到匹配行的后面,而不是替换匹配的字符串。
内容的提问来源于stack exchange,提问作者user1424739
相关产品推荐
相关产品推荐

