Bash ninjas 的问题:我有一个 XML 模板文件,它有一些格式为 {{VARIABLE_NAME}}
的模板标记,我想用以下内容查找/替换该标记的所有出现一个文本文件。
想象一下 template.xml
看起来像这样:
<?xml>
<root>
<description>
{{DESCRIPTION}}
</description>
</root>
我有一个名为 description.txt
的文本文件,它可能包含任何字符(为简单起见,我们假设它已经是 xml 安全的)。我想用文件内容替换标记,支持换行和其他字符。
以前我一直在我的代码中这样做(这对简单的字符串非常有用):
sed -i '' -e "s/{{DESCRIPTION}}/$DESCRIPTION/g" template.xml
但是,如果 $DESCRIPTION
包含换行符,sed 会停止:
sed: 1: "s/{{DESCRIPTION}}/Hello w ...": unescaped newline inside substitute pattern
有没有更好的方法来做到这一点,或者我应该首先在 $DESCRIPTION
变量中搜索/替换所有带有转义变体的换行符。还有其他我需要转义的字符吗,比如 /
?
最佳答案
这是一个用于替换的 BASH(实际上是 sh)脚本:
#!/bin/sh
while IFS= read -r line
do
case "$line" in
*{{DESCRIPTION}})
cat "description.txt"
;;
*)
echo "$line"
;;
esac
done <"template.xml"
在问题陈述中,“{{DESCRIPTION}}”单独出现在一行中。如果通常情况并非如此,则需要进行一些小的更改以保留线路上的其他数据。
关于Bash/sed 字符串替换为文件内容(包含换行符),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20713300/