MacOS(少なくともOS 10)とUnixで同様に機能するSedコマンド(つまり、Gillesのような(現在受け入れられている)gnu sedを必要としません):
sed -e '/CLIENTSCRIPT="foo"/a\'$'\n''CLIENTSCRIPT2="hello"' file
これは、bashや、おそらく$ '\ n'評価引用スタイルを知っている他のシェルでも機能します。すべてを1行で記述して、古い/ POSIX sedコマンドで機能させることができます。CLIENTSCRIPT = "foo"(または同等のもの)に一致する行が複数ある可能性があり、追加の行を初めて追加するだけの場合は、次のように修正できます。
sed -e '/^ *CLIENTSCRIPT="foo"/b ins' -e b -e ':ins' -e 'a\'$'\n''CLIENTSCRIPT2="hello"' -e ': done' -e 'n;b done' file
(これにより、ファイルの残りの部分を循環する行挿入コードの後にループが作成され、最初のsedコマンドに戻ることはありません)。
コメントに行が表示されたり、インデントされたりする場合に備えて、一致パターンに「^ *」を追加したことに気付くでしょう。100%完璧ではありませんが、一般的であると思われる他のいくつかの状況をカバーします。必要に応じて調整...
これらの2つのソリューションは、(行を追加する一般的なソリューションの)問題を回避します。新しい挿入された行にエスケープされていないバックスラッシュまたはアンパサンドが含まれている場合、sedによって解釈され、同じように出力されない可能性があります\n
。\0
一致した最初の行になります。特に前に$ {var //}または別のsedステートメントなどを使用してすべてをエスケープする必要がある変数からの行を追加する場合に特に便利です。
このソリューションは、スクリプトで少し面倒ではありません(引用符と\ nは読みにくいです)。たとえば、関数内で、コマンドの置換テキストを行の先頭に配置したくない場合インデントされた行。$ '\ n'が通常の '\ n'一重引用符の値ではなく、シェルによって改行として評価されることを利用しました。
読みやすさのためにperl / awkでも勝てるかもしれないと思いますが、十分長くなります。