我尝试使用脚本替换部分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
它给了我错误:替换模式中未转义的换行符
我在过去几个小时内尽可能多地尝试了同样的结果。任何援助将不胜感激。
答案 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"