1

我想使用 bash 脚本插入一大段代码。

这就是我使用 sed(1) 让它工作的方式;

$ sed "/);/i\
\ \ \ \ 'doctrine' => array(\n\
        'driver' => array(\n\
            __NAMESPACE__ . '_driver' => array(\n\
                'class' => 'Doctrine\ORM\Mapping\Driver\AnnotationDriver',\n\
                'cache' => 'array',\n\
                'paths' => array(__DIR__ . '\../src/' . __NAMESPACE__ . '/Entity')\n\
            ),\n\
            'orm_default' => array(\n\
                'drivers' => array(\n\
                    __NAMESPACE__ . '\Entity' => __NAMESPACE__ . '_driver'\n\
                )\n\
            )\n\
        )\n\
    ),\n
" config/autoload/local.php;

注意:我必须在每行末尾添加 \n 和 \ 才能使其正常工作。

有没有办法“不”必须这样做?插入纯文本?也许是一个不同的命令?

编辑:我的问题是如何插入文本而不必添加所有反斜杠和换行符。

这是我需要插入的文本:

'doctrine' => array(
    'driver' => array(
        __NAMESPACE__ . '_driver' => array(
            'class' => 'Doctrine\ORM\Mapping\Driver\AnnotationDriver',
            'cache' => 'array',
            'paths' => array(__DIR__ . '/../src/' . __NAMESPACE__ . '/Entity')
        ),
        'orm_default' => array(
            'drivers' => array(
                __NAMESPACE__ . '\Entity' => __NAMESPACE__ . '_driver'
            )
        )
    )
)
4

4 回答 4

2

这是一种方法:

sed '/);/i\
'doctrine' => array(\
    'driver' => array(\
        __NAMESPACE__ . '_driver' => array(\
            'class' => 'Doctrine\ORM\Mapping\Driver\AnnotationDriver',\
            'cache' => 'array',\
            'paths' => array(__DIR__ . '/../src/' . __NAMESPACE__ . '/Entity')\
        ),\
        'orm_default' => array(\
            'drivers' => array(\
                __NAMESPACE__ . '\Entity' => __NAMESPACE__ . '_driver'\
            )\
        )\
    )\
)' file.php

如果您尝试插入文件,请尝试:

sed '/);/ { 
    h
    r replacement.txt
    g
    N
}' file.php
于 2012-10-31T00:44:48.367 回答
0

如果您坚持使用sed,一种方法(不在每行末尾使用反斜杠)是将其保存到临时文件中,例如

cat >tempfile <<'EOF'
  code here...
EOF

然后使用r(读取)命令sed

sed '/);/ r tempfile' config/autoload/local.php
于 2012-10-31T02:35:26.170 回答
0
cat << 'EOF' >> config/autoload/local.php
'doctrine' => array(
    'driver' => array(
        __NAMESPACE__ . '_driver' => array(
            'class' => 'Doctrine\ORM\Mapping\Driver\AnnotationDriver',
            'cache' => 'array',
            'paths' => array(__DIR__ . '/../src/' . __NAMESPACE__ . '/Entity')
        ),
        'orm_default' => array(
            'drivers' => array(
                __NAMESPACE__ . '\Entity' => __NAMESPACE__ . '_driver'
            )
        )
    )
)
EOF

要将这些行与 sed 一起使用,您可以使用以下命令打印到变量中read

read -d '' multiLineString <<"EOF"
'doctrine' => array(
    'driver' => array(
        __NAMESPACE__ . '_driver' => array(
            'class' => 'Doctrine\ORM\Mapping\Driver\AnnotationDriver',
            'cache' => 'array',
            'paths' => array(__DIR__ . '/../src/' . __NAMESPACE__ . '/Entity')
        ),
        'orm_default' => array(
            'drivers' => array(
                __NAMESPACE__ . '\Entity' => __NAMESPACE__ . '_driver'
            )
        )
    )
)
EOF

然后$multiLineStringsed.

于 2012-10-31T00:38:41.897 回答
0

这可能对您有用(GNU sed):

cat <<\! >insert_file
    'doctrine' => array(
    'driver' => array(
        __NAMESPACE__ . '_driver' => array(
            'class' => 'Doctrine\ORM\Mapping\Driver\AnnotationDriver',
            'cache' => 'array',
            'paths' => array(__DIR__ . '/../src/' . __NAMESPACE__ . '/Entity')
        ),
        'orm_default' => array(
            'drivers' => array(
                __NAMESPACE__ . '\Entity' => __NAMESPACE__ . '_driver'
            )
        )
    )
)

!
sed '/);/e cat insert_file' file.php
于 2012-10-31T10:10:01.397 回答