0

次のPHPファイルがあります。

<?php

use Symfony\Component\HttpKernel\Kernel;
use Symfony\Component\Config\Loader\LoaderInterface;

class AppKernel extends Kernel
{
    public function registerBundles()
    {
        $bundles = array(
            new Symfony\Bundle\FrameworkBundle\FrameworkBundle(),
            new Symfony\Bundle\SecurityBundle\SecurityBundle(),
            new Symfony\Bundle\TwigBundle\TwigBundle(),
            new Symfony\Bundle\MonologBundle\MonologBundle(),
            new Symfony\Bundle\SwiftmailerBundle\SwiftmailerBundle(),
            new Symfony\Bundle\AsseticBundle\AsseticBundle(),
            new Doctrine\Bundle\DoctrineBundle\DoctrineBundle(),
            new Sensio\Bundle\FrameworkExtraBundle\SensioFrameworkExtraBundle(),
            new JMS\AopBundle\JMSAopBundle(),
            new JMS\DiExtraBundle\JMSDiExtraBundle($this),
            new JMS\SecurityExtraBundle\JMSSecurityExtraBundle(),
        );

        if (in_array($this->getEnvironment(), array('dev', 'test'))) {
            $bundles[] = new Acme\DemoBundle\AcmeDemoBundle();
            $bundles[] = new Symfony\Bundle\WebProfilerBundle\WebProfilerBundle();
            $bundles[] = new Sensio\Bundle\DistributionBundle\SensioDistributionBundle();
            $bundles[] = new Sensio\Bundle\GeneratorBundle\SensioGeneratorBundle();
        }

        return $bundles;
    }

    public function registerContainerConfiguration(LoaderInterface $loader)
    {
        $loader->load(__DIR__.'/config/config_'.$this->getEnvironment().'.yml');
    }
}

最後の行の末尾にカンマがある場合とない場合があることを考慮して、最後に $bundles 変数に行を追加したいと思います。

追加する必要がある行は次のとおりです。

new FOS\\UserBundle\\FOSUserBundle()

私は自分のバージョンを書きましたが、$bundles 配列の最後の要素にカンマがあるとうまくいきません。

少し変更が必要ですが、どうすればよいかわかりません。

sed '/bundles.=.array/,/);/ { /[^(,;]$/ s//&,\n            new FOS\\UserBundle\\FOSUserBundle()/ }' app/AppKernel.php;

最終ファイルは次のようになります。

<?php

use Symfony\Component\HttpKernel\Kernel;
use Symfony\Component\Config\Loader\LoaderInterface;

class AppKernel extends Kernel
{
    public function registerBundles()
    {
        $bundles = array(
            new Symfony\Bundle\FrameworkBundle\FrameworkBundle(),
            new Symfony\Bundle\SecurityBundle\SecurityBundle(),
            new Symfony\Bundle\TwigBundle\TwigBundle(),
            new Symfony\Bundle\MonologBundle\MonologBundle(),
            new Symfony\Bundle\SwiftmailerBundle\SwiftmailerBundle(),
            new Symfony\Bundle\AsseticBundle\AsseticBundle(),
            new Doctrine\Bundle\DoctrineBundle\DoctrineBundle(),
            new Sensio\Bundle\FrameworkExtraBundle\SensioFrameworkExtraBundle(),
            new JMS\AopBundle\JMSAopBundle(),
            new JMS\DiExtraBundle\JMSDiExtraBundle($this),
            new JMS\SecurityExtraBundle\JMSSecurityExtraBundle(),
            new FOS\UserBundle\FOSUserBundle(), //with comma or without

        );

        if (in_array($this->getEnvironment(), array('dev', 'test'))) {
            $bundles[] = new Acme\DemoBundle\AcmeDemoBundle();
            $bundles[] = new Symfony\Bundle\WebProfilerBundle\WebProfilerBundle();
            $bundles[] = new Sensio\Bundle\DistributionBundle\SensioDistributionBundle();
            $bundles[] = new Sensio\Bundle\GeneratorBundle\SensioGeneratorBundle();
        }

        return $bundles;
    }

    public function registerContainerConfiguration(LoaderInterface $loader)
    {
        $loader->load(__DIR__.'/config/config_'.$this->getEnvironment().'.yml');
    }
}
4

1 に答える 1

1

言うまでもなく、ファイルの形式が大きく逸脱している場合、これは失敗しますが、あなたの場合、次は GNU sed で機能します。

*add_line.sed*

/bundles.=.array/ {     # When the right array is found
  : a
  N                     # Keep two lines in pattern space
  /);/bb                # Jump to b when end of array reached
  P                     # Print first line of pattern space
  s/[^\n]*\n//          # and delete it
  ba                    # Jump to a and repeat
  : b
  /,\n/! s#\n#,\n#      # Ensure comma ends the line before end of array
  s#\([ \t]*\)\([^\n]*\)\n#\1\2\n\1new FOS\\UserBundle\\FOSUserBundle()\n#
}

次のように実行します。

sed -f add_line.sed app/AppKernel.php

またはワンライナーとして:

sed '/bundles.=.array/ { :a; N; /);/bb; P; s/[^\n]*\n//; ba; :b; /,\n/! s#\n#,\n#; s#\([ \t]*\)\([^\n]*\)\n#\1\2\n\1new FOS\\UserBundle\\FOSUserBundle()\n#; }' app/AppKernel.php

出力の抜粋:

...
    $bundles = array(
        new Symfony\Bundle\FrameworkBundle\FrameworkBundle(),
        new Symfony\Bundle\SecurityBundle\SecurityBundle(),
        new Symfony\Bundle\TwigBundle\TwigBundle(),
        new Symfony\Bundle\MonologBundle\MonologBundle(),
        new Symfony\Bundle\SwiftmailerBundle\SwiftmailerBundle(),
        new Symfony\Bundle\AsseticBundle\AsseticBundle(),
        new Doctrine\Bundle\DoctrineBundle\DoctrineBundle(),
        new Sensio\Bundle\FrameworkExtraBundle\SensioFrameworkExtraBundle(),
        new JMS\AopBundle\JMSAopBundle(),
        new JMS\DiExtraBundle\JMSDiExtraBundle($this),
        new JMS\SecurityExtraBundle\JMSSecurityExtraBundle(),
        new FOS\UserBundle\FOSUserBundle()
    );

...
于 2012-11-16T08:19:46.320 に答える