Bash 如何用shell变量中的多行值替换文件中的字符串

Bash 如何用shell变量中的多行值替换文件中的字符串,bash,macos,sed,Bash,Macos,Sed,我正在尝试使用脚本替换plist的一部分(使用macos High Sierra) 我将一个变量设置为for循环的输出,当我回显或打印它时,所述输出如下所示: <array> <dict> <key>cfurl_string</key> <string>/Applications/Launchpad.app</string> </dict> <dict> <key>cfu

我正在尝试使用脚本替换plist的一部分(使用macos High Sierra)

我将一个变量设置为for循环的输出,当我回显或打印它时,所述输出如下所示:

<array>
 <dict>
  <key>cfurl_string</key>
  <string>/Applications/Launchpad.app</string>
 </dict>
 <dict>
  <key>cfurl_string</key>
  <string>/Applications/Safari.app</string>
 </dict>
 <dict>
  <key>cfurl_string</key>
  <string>/Applications/Pages.app</string>
 </dict>
 <dict>
  <key>cfurl_string</key>
  <string>/Applications/Numbers.app</string>
 </dict>
 <dict>
  <key>cfurl_string</key>
  <string>/Applications/Keynote.app</string>
 </dict>
 <dict>
  <key>cfurl_string</key>
  <string>/Applications/Photos.app</string>
 </dict>
 <dict>
  <key>cfurl_string</key>
  <string>/Applications/iMovie.app</string>
 </dict>
 <dict>
  <key>cfurl_string</key>
  <string>/Applications/GarageBand.app</string>
 </dict>
 <dict>
  <key>cfurl_string</key>
  <string>/Applications/Microsoft Word.app</string>
 </dict>
 <dict>
  <key>cfurl_string</key>
  <string>/Applications/Microsoft Excel.app</string>
 </dict>
</array>

cfurl\u字符串
/应用程序/Launchpad.app
cfurl\u字符串
/应用程序/Safari.app
cfurl\u字符串
/应用程序/页面.app
cfurl\u字符串
/Applications/Numbers.app
cfurl\u字符串
/应用程序/Keynote.app
cfurl\u字符串
/应用程序/Photos.app
cfurl\u字符串
/应用程序/iMovie.app
cfurl\u字符串
/应用程序/GarageBand.app
cfurl\u字符串
/应用程序/Microsoft Word.app
cfurl\u字符串
/应用程序/Microsoft Excel.app
我还设置了一个plist作为模板,以便找到值“”,并用上面显示的输出替换它。如果我使用像“test”或“word”这样的常规字符串,它完全可以查找,但是如果我使用值(即

sed -e "s|<array></array>|${test}|" dmt.plist > dmtfinished.plist
sed-e“s | |${test}|”dmt.plist>dmtfinished.plist
它给了我一个错误:替换模式中的未替换换行符


在过去的几个小时里,我已经尽了最大努力,结果都是一样的。任何协助都将不胜感激

使用
sed执行此操作的最简单方法是:

sed -e '/<array><\/array>/{r /dev/stdin' -e ';d;}' file <<<"$test"

发布预期结果我在上面发布的是预期结果,我有一个plist,其中一行设置为“”。我想用我在上面发布的变量输出替换它;第一组代码当我运行itOh时,我在d的末尾得到了一个额外的字符,请尝试添加
,或多行版本(请参阅我的编辑)。这是有效的,但我不明白为什么。我需要仔细看看你做了什么,因为这并不明显。它也没有像我想的那样保存,但还是谢谢你。这是一个经典的
sed
模式,用于从shell变量追加文本。当我第一次看到它的时候,可能并不明显,但我试图解释它的要点。诀窍是使用
r
命令,结合
/dev/stdin
文件(可在
bash
中找到)和here-string。添加了一些链接,希望它们能引导您进一步了解sed/bash魔术发现
sed '/<array><\/array>/ {
    r /dev/stdin
    d
}' file <<<"$test"