SEDコマンドを使用して構成ファイルに変更を適用したいと思います。この場合、開始タグの後ろの複数の場所にいくつかの行を挿入する必要があります。
しかし、私が試したとき:
sed '/\[httpd/\]/a secure_rewrites = false; /\[couchdb/\]/adelayed_commits = false' local.ini
[httpd]の後に次の行が追加されたことがわかりました。
secure_rewrites = false [couchdb]/adelayed_commits=false
これは明らかに私が望むものではありません。
追加のコマンドをリンクできますか?
答え1
GNUによるsed
a text
サブコマンドは追加するテキストを操作します。このテキストは行末まで読み込まれます。次のトリックを適用して改行を模倣することができます。
sed '/\[httpd\]/a secure_rewrites = false;
/\[couchdb\]/adelayed_commits = false' local.ini
出力例:
...
[httpd]
secure_rewrites = false;
...
[couchdb]
delayed_commits = false
答え2
GNUを使用するsed
(sed
追加された文字列にリテラル改行文字が含まれていない限り、BSDは追加されたテキストの後に改行文字を追加しません):
sed -e '/\[httpd\]/a\' -e 'secure_rewrites = false;' \
-e '/\[couchdb\]/a\' -e 'delayed_commits = false;' local.ini
ファイルに以下が含まれている場合
[httpd]
[couchdb]
最初は上記のsed
コマンドを実行すると
[httpd]
secure_rewrites = false;
[couchdb]
delayed_commits = false;
また、a
テキストを追加するコマンドは、追加されa\
たテキストの後に作成する必要があります。 GNUはsed
省略を許可します\
。
sed
スクリプトとして(すべてで動作sed
):
/\[httpd\]/a\
secure_rewrites = false;
/\[couchdb\]/a\
delayed_commits = false;
これは、コマンドラインでリテラル一重引用符で囲まれたスクリプト文字列として使用するかsed
(新しい行は最後の行の後に来る必要があります)、別々に保存して次のようにsed
入力できます。
$ sed -f script.sed local.ini
を使用すると、#!/usr/bin/sed -f
最初の行(パスがsed
正しいと仮定)からスクリプトを直接実行することもできます。
$ ./script.sed local.ini