2017-10-31 5 views
1

スクリプトを使用してplist(Mac OS High Sierraを使用)の一部を置き換えようとしています。ファイル内の文字列をシェル変数の複数行の値に置き換える方法

私はforループの出力に変数セットを持っていると私はエコーまたはそれをprintfのときの出力は次のようになります言った:

<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のを持っています私は値を見つけ出し、それを上記の出力と置き換えることができます。私は「テスト」や「ワード」のような通常の文字列を使用している場合、それは完全に見つける動作しますが、私は

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

すなわち値を指定して、コマンドを実行した場合、それは私にエラーを与える:代替パターン

内部エスケープされていない改行を

私は過去数時間同じような結果を得て、できる限り試してみました。いかなる援助も感謝します。

+0

は、私は上記の投稿何を期待された結果 – RomanPerekhrest

+0

が期待された結果であるポスト、私は「」に設定行とのplistを持っています。私はそれを上記の変数出力に置き換えたいと思います。最初のコードセット –

答えて

0

sedでそれを行うための最も簡単な方法:

我々は <array></array>文字列に遭遇したときに、ファイル名 /dev/stdinからテキストを追加する r filename commandを使用
sed -e '/<array><\/array>/{r /dev/stdin' -e ';d;}' file <<<"$test" 

。変数$testの内容をhere-stringリダイレクト経由で/dev/stdinに送ります。追加の後、パターンスペースを削除します。

また、sedプログラムを2つの式でブレークする必要があります。その理由は、コマンドは改行で終了する必要があるからです。代替は、いくつかの行でプログラムを書くことである:

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

実行時にdコマンドエラーの末尾に余分な文字が表示されます –

+0

ああ、 ';'、または複数行バージョンを追加してみてください(私の編集を参照)。 – randomir

+0

これはうまくいったが、私はその理由を理解していない。私はあなたがしたことを読み返す必要があります。なぜなら、あからさまにはっきりしていないからです。また、私がしたいのと同じように保存しませんでしたが、それほど感謝しませんでした。あなたは正しい方向に私を入れました –

関連する問題