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

Bash 使用sed插入具有特殊字符的文件内容,bash,sed,sh,Bash,Sed,Sh,我想用file2.txt的全部内容替换file1.txt中的一个标记(REPLACETHIS),其中包括换行符和特殊字符 file2.txt的内容示例如下 <Location /> Order deny,allow Deny from all Allow from 1.2.3.4 Allow from 5.6.7.8 </Location> 命令拒绝,允许 全盘否定 允许从1.2.3.4开始 允许从5.6

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

file2.txt的内容示例如下

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

命令拒绝,允许
全盘否定
允许从1.2.3.4开始
允许从5.6.7.8开始
我的通用代码,减去特殊字符的处理,看起来像这样:

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

value=$(在
sed
中,从文件插入文本的最佳选项是使用以下命令:

或者,以扩展形式:

sed -i '/REPLACETHIS/ {
    r /path/to/file2.txt
    d
}' file1.txt
r file
命令将从
file
读取文本并将其插入输出流。要同时删除
REPLACETHIS
文本,我们需要delete
d
命令(提示:这将删除包含文本的完整行
REPLACETHIS
;如果需要使用中间文本标记,可以将
d
替换为
s//
,如@ghoti所述)

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


还请注意,BSD
sed
处理
-i
选项的方式与GNU
sed
不同。上述操作将在GNU中工作,但如果BSD需要它,则应在
sed
中编写:
-i'
而不是
-i

,插入文件文本的最佳选项是使用以下命令:

或者,以扩展形式:

sed -i '/REPLACETHIS/ {
    r /path/to/file2.txt
    d
}' file1.txt
r file
命令将从
file
读取文本并将其插入输出流。要同时删除
REPLACETHIS
文本,我们需要delete
d
命令(提示:这将删除包含文本的完整行
REPLACETHIS
;如果需要使用中间文本标记,可以将
d
替换为
s//
,如@ghoti所述)

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


还请注意,BSD
sed
处理
-i
选项与GNU
sed
不同。上述操作将在GNU中工作,但如果BSD需要它,您应该编写:
-i'
而不是
-i

sed
对于这一点,您完全不需要使用
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 '%s\n' "${infile//REPLACETHIS/$value}" >"$tempfile"; then
  mv -- "$tempfile" "$file_to_change"
else
  rm -f -- "$tempfile"
fi
file\u to\u change=/home/name/scripts/file1.txt

value=$(One完全不需要为此使用
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 '%s\n' "${infile//REPLACETHIS/$value}" >"$tempfile"; then
  mv -- "$tempfile" "$file_to_change"
else
  rm -f -- "$tempfile"
fi
file\u to\u change=/home/name/scripts/file1.txt

Value= $$(您必须使用SED吗?是<代码>单独在它的行上替换这个< /代码>,还是可以在同一行上被其他文本(<代码>预先替换这个< /代码>)包围?从示例内容看来,您不会插入到一个行的中间,这是一个更容易的整体堆。(
sed
可以处理它,如的所示)如果你正在插入中间,我将工具切换到Perl.BTW,你使用的<代码> SED-I/COD>这里与GNU<代码> SED兼容,但不与BSD <代码> SED >——例如MACOS,这将尝试使用<代码> -E >代码>作为备份文件上的扩展。你必须使用SED吗?单独在它的行上,或者它可以被其他文本(<代码>预先替换这个“< /代码>”)包围在同一行输入上吗?从样本内容看来,您不会插入到一行中,这是一个更容易的堆(<代码> SED可以处理它,如S所示)。如果你正在插入中间,我会把工具切换到Perl.BTW,你使用的<代码> SED-I/COD>这里与GNU<代码> SED兼容,但不与BSD <代码> SED >——关于MaCOS,例如,这将尝试使用<代码> -E <代码>作为放在备份文件上的扩展。你是对的,我刚刚意识到:修正。一旦你修正了,我的答案就不会给你的答案增加太多了。:)介意添加一个关于
REPLACETHIS
的但书,它与其他内容一起出现在一行中,可能还提到了这类
-我使用GNU-sed ism?(问题通常是特定于平台的,但如果答案是可移植的,答案总是更好。)谢谢,@ghoti。我想这样就可以了。:)你说得对,我刚刚意识到我自己。:)修正了。一旦你修正了,我的答案对你的答案没有多大帮助。:)想添加一个关于
替换的但书吗?
与其他内容一起出现在一行中,也许还会提到这种类型的
-我使用GNU-sed ism?(问题通常是特定于平台的,但如果答案是可移植的,则答案总是更好。)谢谢,@ghoti。我想这就够了