Bash 用从其他文件中提取的内容替换一个字符串

Bash 用从其他文件中提取的内容替换一个字符串,bash,Bash,我有一个TARGET.md文件,我正在寻找一个字符串,我想用其他md文件的内容替换它,我尝试了许多组合,但似乎文件中的换行符是sed不喜欢的,我只需要使用纯bash(它不一定是sed)因为这就是整个脚本的运行方式: 这项工作: local search=“#####头” 本地替换=“#######头\\ \\ 第1行\\ 第2行\\ 第3行\\ 第4行“ sed-i'-e“s/${search}/${replace}/”TARGET.md 但这不会: file1.md内容: ##### Hea

我有一个TARGET.md文件,我正在寻找一个字符串,我想用其他
md
文件的内容替换它,我尝试了许多组合,但似乎文件中的换行符是
sed
不喜欢的,我只需要使用纯bash(它不一定是
sed
)因为这就是整个脚本的运行方式:

这项工作:

local search=“#####头”
本地替换=“#######头\\
\\
第1行\\
第2行\\
第3行\\
第4行“
sed-i'-e“s/${search}/${replace}/”TARGET.md
但这不会:

file1.md内容:

##### Header

Line 1
Line 2
Line 3
Line 4
    local search="##### Header"
    local replace=$(curl "path/to/file/in/other/place/file1.md")
    sed -i '' -e "s/${search}/${replace}/" TARGET.md
脚本:

##### Header

Line 1
Line 2
Line 3
Line 4
    local search="##### Header"
    local replace=$(curl "path/to/file/in/other/place/file1.md")
    sed -i '' -e "s/${search}/${replace}/" TARGET.md
注意:我没有将
file1.md
放在同一个位置,我正在进行卷曲以从中获取原始内容,这就是替换在变量中的原因

我假设这个概念是可能的,但是我的sed语法是错误的,因为我知道sed可以处理开箱即用的换行符,但不确定什么是正确的方法


我已经搜索了几天了,任何帮助、提示或指导都将不胜感激

您使用了错误的工具
sed
本质上是一个行编辑器。虽然在某些情况下可以重复地附加到模式空间,但使用
getline
awk
提供了更灵活的解决方案。例如,您的
file1.md

标题
第1行
第2行
第3行
第4行
您的
TARGET.md
为:

未发布
我的狗
有跳蚤
要用
file1.md
的内容替换
“########未发布”
,您可以执行以下操作:

awk -v replace="file1.md" -v search="##### Unreleased" '
    $0 == search {while (getline line < replace ) { print line }; next }
                 { print }
' TARGET.md

仔细检查一下,如果您还有其他问题,请告诉我。

从David的回答中获取
TARGET.md
文件:

cat TARGET.md
#####未发布
我的狗
有跳蚤
您可以使用
r
命令运行
sed
,如下所示:

search=“######未发布”
sed-e/$search/{r file1.md“-e';d;}”TARGET.md
#####标题
第1行
第2行
第3行
第4行
我的狗
有跳蚤

你能给我看看示例
TARGET.md
@anubhava,
TARGET.md
很简单:
标题-测试内容
@oguzismail我实际上没有
文件1.md
在同一个地方,我正在做卷曲以获取原始内容我意识到当我看到答案时,刚刚更新了问题,感谢@oguzismail的评论,请使用
sed
命令的预期结果更新问题;请用您当前问题的更多细节更新问题,例如,“这不会”是什么意思?你有错误吗?你得到了错误的结果吗?运行
replace=$(curl…
)后,向我们展示
replace
中的内容,例如,
typeset-p replace
谢谢你@david-c-rankin,我在问题中没有解释我的文件1.md实际上不在同一个位置,我在做curl来获取原始内容。@RudyPalacios如果你
curl
,注意
curl
将DOS行尾添加到下载的文件中。在这种情况下,这无关紧要,
awk
在使用默认字段分隔符时将回车符视为空格,但是如果您在
curl
之后进行更多更改或添加其他实用程序,则可以使用
dos2unix file1.md
转换行结尾,或者使用
sed-i's/\r/$/'file1.md