如何避免必须使用SED(1)添加' n'



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

这就是我使用sed(1);

才能工作的方式
$ sed "/);/i
    'doctrine' => array(n
        'driver' => array(n
            __NAMESPACE__ . '_driver' => array(n
                'class' => 'DoctrineORMMappingDriverAnnotationDriver',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' => 'DoctrineORMMappingDriverAnnotationDriver',
            'cache' => 'array',
            'paths' => array(__DIR__ . '/../src/' . __NAMESPACE__ . '/Entity')
        ),
        'orm_default' => array(
            'drivers' => array(
                __NAMESPACE__ . 'Entity' => __NAMESPACE__ . '_driver'
            )
        )
    )
)

这是一种方法:

sed '/);/i
'doctrine' => array(
    'driver' => array(
        __NAMESPACE__ . '_driver' => array(
            'class' => 'DoctrineORMMappingDriverAnnotationDriver',
            '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
cat << 'EOF' >> config/autoload/local.php
'doctrine' => array(
    'driver' => array(
        __NAMESPACE__ . '_driver' => array(
            'class' => 'DoctrineORMMappingDriverAnnotationDriver',
            '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' => 'DoctrineORMMappingDriverAnnotationDriver',
            'cache' => 'array',
            'paths' => array(__DIR__ . '/../src/' . __NAMESPACE__ . '/Entity')
        ),
        'orm_default' => array(
            'drivers' => array(
                __NAMESPACE__ . 'Entity' => __NAMESPACE__ . '_driver'
            )
        )
    )
)
EOF

然后将$multiLineStringsed一起使用。

如果您坚持使用 sed,则一种方式(每行末尾不使用后斜线)将其保存到临时文件,例如

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

然后使用sed中的r(read)命令

sed '/);/ r tempfile' config/autoload/local.php

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

cat <<! >insert_file
    'doctrine' => array(
    'driver' => array(
        __NAMESPACE__ . '_driver' => array(
            'class' => 'DoctrineORMMappingDriverAnnotationDriver',
            'cache' => 'array',
            'paths' => array(__DIR__ . '/../src/' . __NAMESPACE__ . '/Entity')
        ),
        'orm_default' => array(
            'drivers' => array(
                __NAMESPACE__ . 'Entity' => __NAMESPACE__ . '_driver'
            )
        )
    )
)
!
sed '/);/e cat insert_file' file.php

最新更新