bashスクリプトで指定された行番号の後または間に変数の内容を挿入するには?

bashスクリプトで指定された行番号の後または間に変数の内容を挿入するには?

私のスクリプトは、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標準拡張からインスピレーションを得ます)。-isedperl

#! /bin/sh -
SCRIPT_LINES='for all "vars";find Runtime ("stm32") use "c++"

' perl -i -pe '$_ = "$ENV{SCRIPT_LINES}$_" if $. == 4' environment.cfg

関連情報