私のスクリプトは、4行目の後にいくつかの設定を変数に格納されているテキストブロックとして挿入することで設定ファイルを変更します。 MacOS バージョンの sed と一部の非互換性があることを知っていて GNU バージョンをインストールしましたが、どの SED が実行されているかわかりません。
#!/bin/bash
SCRIPT_LINES="すべての"vars"に対して;\findランタイム("stm32")は"c++"を使用します。\n\n" sed -i'' "4i$SCRIPT_LINES"environment.cfg
SEDの構文は意味がなく、選択肢があることを望んでいましたが、良い選択肢はないようです。 bashスクリプトの変数に含まれるテキストブロックを別のファイルに挿入するにはどうすればよいですか?
答え1
sedの構文が意味がないと判断された場合は、さまざまな方法で特定の場所に行を挿入できます。非常に理解しやすい方法:
( head -n 4 environment.cfg && echo "$script_lines" && tail -n +5 environment.cfg ) > /tmp/tmp-environment.cfg
mv /tmp/tmp-environment.cfg environment.cfg
つまり、ファイルの最初の4行をエコーしてから変数をエコーし、行5から始まるすべての内容を印刷します。結果を一時ファイルに保存してコピーします。
これは避けられますsed
。 ☺
しかし、私の考えでは、GNU sedではこれだけです
sed -i "4a $script_lines" environment.cfg
OS X sedの場合:
sed -i '' "4a $script_lines" environment.cfg
実行しているバージョンを確認するには:
sed --version
答え2
代わりに、次のものを使用できます(一部の実装では互換性のない方法で追加する非perl
標準拡張からインスピレーションを得ます)。-i
sed
perl
#! /bin/sh -
SCRIPT_LINES='for all "vars";find Runtime ("stm32") use "c++"
' perl -i -pe '$_ = "$ENV{SCRIPT_LINES}$_" if $. == 4' environment.cfg