sed 追加コマンドをリンクするには?

sed 追加コマンドをリンクするには?

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を使用するsedsed追加された文字列にリテラル改行文字が含まれていない限り、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

関連情報