Bash/sed 字符串替换为文件内容(包含换行符)

标签 bash sed

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/

相关文章:

bash - 当它们具有公共(public)列时将字符串从一个文件添加到另一个文件

linux - Bash enter & ctrl-z 按键

linux - 在 Bash Cloud Shell 中映射 Azure 文件共享

regex - sed 用下划线替换 2 个字符串之间的空格

linux - Linux删除多个文件中包含一个字符串的一行

bash - 使用 [[ ]] 和 -eq 时出错

python - pip已安装但无法运行

linux - 从制表符分隔的文件中删除重复的单词/字符串

linux - 如何使用 Bash 和标准实用程序确定两个字符串之间的行数?

linux - 使用 SED 围绕管道输入连接文本