用sed中的文件内容替换字符串

时间:2018-11-01 19:40:15

标签: bash awk sed

我迷失了尝试用sed替换以下内容:

@编辑:要捕获我的问题的全部复杂性, 我添加了以下事实:文件名包含在变量中。 因此,解决方案可能直接使用文件名。

给出了变量I ='insert.txt':

'insert.txt':

Text I wanna skip.

This is text to insert containing
spaces and new lines

给出了一个变量M ='toModify.txt':

'toModify.txt':

Insert the new text: here.

我想用内容替换$ M中的“这里” 的$ I:

Insert the new text: This is text to insert containing
spaces and new lines.

我尝试过:

sed -e "s/here/$(tail -n2 $I | sed -e 's/ /\\ /g' | tr '\n' '\\n')/" $M

,出现错误: sed未终止的s命令

问题是我不终止s命令就无法获得空格和换行符。

有解决方案吗?

3 个答案:

答案 0 :(得分:0)

您可以使用此awk

awk 'BEGIN{prs=RS; RS=""; getline s < "insert.txt"; RS=prs}
{gsub(/here/, s)} 1' toModify.txt

Insert the new text: This is text to insert containing
spaces and new lines.

答案 1 :(得分:0)

您不能使用tr用两个字符替换一个字符。无论如何,逃避单个空间是没有意义的。立即发生错误的原因是,您最终也逃脱了最后的斜杠:

linux$ tail -n2 "$I" | sed -e 's/ /\\ /g' | tr '\n' '\\n'
This\ is\ text\ to\ insert\ containing\spaces\ and\ new\ lines\/

转义空格是毫无意义的。我猜你想要这样的东西:

linux$ sed '1,2d;$!s/$/\\/' "$I"
This is text to insert containing\
spaces and new lines

我们删除第一行和第二行;然后在除最后一行之外的所有换行符之前添加反斜杠。

linux$ sed -e "s/here/$(sed '1,2d;$!s/$/\\/' "$I")/" "$M"
Insert the new text: This is text to insert containing
spaces and new lines.

这是sed的一个细节,并非完全可移植。但是以上对我适用于Linux和MacOS。 (请注意,您可能需要set +H才能禁用csh样式的历史记录扩展,也称为-bash: !s/$/\\/': event not found错误)。

答案 2 :(得分:0)

使用Perl单线版

> cat insert.txt
This is text to insert containing
spaces and new lines
> cat toModify.txt
Insert the new text: here
> export I=insert.txt
> export M=toModify.txt
> perl -ne 'BEGIN{$x=qx(cat $ENV{M});$x=~s/here/qx(cat $ENV{I})/e; print $x;exit }'
Insert the new text: This is text to insert containing
spaces and new lines

>