これを sed で確実に実現するのは難しいため、適切な JSON ライブラリを使用する必要があります。
しかし、GNU sed でやりたいことを行うには、次のようにすることができます (ここでは末尾のコンマをチェックせずに):
sed '/require/,/},/ s/},/, "friendsofsymfony\/user-bundle": "\*"\n&/
末尾のコンマを確認するには、さらに解析を行う必要があります。
parse.sed
/^[ \t]*"require/ { # when 'require' found
: a
N # run through pairwise
/\n[\t ]*\},/! { P; s/[^\n]+\n//; ba } # lines until '},' is found
/,\n/! s/\n/,&/ # append comma if not present
s/\n([\t ]*)},/\n\1\1"friendsofsymfony\/user-bundle": "\*"&/
}
実行:
sed -rf parse.sed infile
提供されたサンプル ファイルで実行したときのparse.sedの出力の抜粋:
[...]
"require": {
"php": ">=5.3.3",
"symfony/symfony": "2.2.*",
"doctrine/orm": ">=2.2.3,<2.4-dev",
"doctrine/doctrine-bundle": "1.0.*",
"twig/extensions": "1.0.*",
"symfony/assetic-bundle": "2.1.*",
"symfony/swiftmailer-bundle": "2.1.*",
"symfony/monolog-bundle": "2.1.*",
"sensio/distribution-bundle": "2.2.*",
"sensio/framework-extra-bundle": "2.2.*",
"sensio/generator-bundle": "2.2.*",
"jms/security-extra-bundle": "1.3.*",
"jms/di-extra-bundle": "1.2.*",
"friendsofsymfony/user-bundle": "*"
},
[...]