2

ファイル内に次のテキスト構造があります。

"require": {
    "php": ">=5.3.3",
    "symfony/symfony": "2.1.*",
    "jms/di-extra-bundle": "1.1.*"
},

追加したい

, "friendsofsymfony/ユーザーバンドル": "*"

'}' の前に、sed(1) を使用します。

また、最後の行の最後にコンマがある場合とない場合があることも考慮する必要があります。

私はたくさんのことを試しました。

sed '/require/,/\},/ { /[^,]$/ i//&,\n        '\'something\''/ }' composer.json;

しかし、私はそれを機能させることができません。

どんな助けでも大歓迎です。

4

2 に答える 2

3

これを 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": "*"
},

[...]
于 2012-11-13T14:44:47.783 に答える
1

iコマンドを使用して挿入します。挿入する文字列の最後に改行が必要です。

sed '/require/,/},/{/^},/i, "friendsofsymfony/user-bundle": "*"
}'
于 2012-11-13T12:57:01.497 に答える