我迷失了尝试用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命令就无法获得空格和换行符。
有解决方案吗?
答案 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
>