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

时间:2017-10-31 21:39:11

标签: bash macos sed

我尝试使用脚本替换部分plist(使用Mac OS 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>

我还有一个我已经设置为模板的plist,以便我可以找到值&#34;&#34;并用我上面显示的输出替换它。如果我使用常规字符串,如&#34; test&#34;或&#34;字&#34;它完全可以找到,但如果我运行带有值的命令,即

sed -e "s|<array></array>|${test}|" dmt.plist > dmtfinished.plist

它给了我错误:替换模式中未转义的换行符

我在过去几个小时内尽可能多地尝试了同样的结果。任何援助将不胜感激。

1 个答案:

答案 0 :(得分:0)

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

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

当我们遇到/dev/stdin字符串时,我们使用r filename command附加文件名<array></array>中的文字。我们通过/dev/stdin重定向将变量$test的内容提供给here-string。在追加之后,我们删除了模式空间。

另请注意,我们必须在两个表达式中打破sed程序,原因是r命令必须以换行符结束。另一种方法是将程序写成几行:

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