使用 sed 插入带有特殊字符的文件内容



我想将file1.txt中的标记(REPLACETHIS)替换为file2.txt的全部内容,其中包括换行符和特殊字符。

file2.txt 的内容示例是

<Location />
        Order deny,allow
        Deny from all
        Allow from 1.2.3.4
        Allow from 5.6.7.8
</Location>

我的一般代码,减去对特殊字符的处理,看起来像这样:

value=$(</home/name/scripts/file2.txt)
sed -i -e "s|REPLACETHIS|$value|" /home/name/scripts/file1.txt

处理这个问题的最佳方法是什么?

sed中,从文件插入文本的最佳选择是使用 r file 命令:

sed -i -e '/REPLACETHIS/{r /path/to/file2.txt' -e ';d;}' file1.txt

或者,以扩展形式:

sed -i '/REPLACETHIS/ {
    r /path/to/file2.txt
    d
}' file1.txt

r file 命令将从file中读取文本并将其插入到输出流中。要删除REPLACETHIS文本,我们需要删除d命令(注意:这将删除包含文本REPLACETHIS的完整行;如果需要使用文本中间标记,您可以将d替换为s///,如@ghoti所述)。

在第一个例子中,我们必须在两个表达式中中断sed程序,原因是r command必须以换行符结尾。另一种方法是分几行编写程序,如扩展示例所示。

另请注意,BSD sed处理-i选项的方式与 GNU sed 不同。以上在 GNU 中可以工作,但如果 BSD 需要它,你应该写:-i ''而不是-i

人们根本不

需要为此使用 sed

file_to_change=/home/name/scripts/file1.txt
value=$(</home/name/scripts/file2.txt)
infile=$(<"$file_to_change")
tempfile=$(mktemp "$file_to_change.XXXXXX")
if printf '%sn' "${infile//REPLACETHIS/$value}" >"$tempfile"; then
  mv -- "$tempfile" "$file_to_change"
else
  rm -f -- "$tempfile"
fi

即使没有sed -i(这是一种非标准、不可移植且常见实现之间不兼容),这也有效。

最新更新