2012-10-31 68 views
1

我想使用bash脚本插入一大块代码。如何避免必须使用sed添加' n'(1)

这是我如何使用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' 
      ) 
     ) 
    ) 
) 
+1

脚本只需插入代码块没有任何特殊搜索或替换命令,为什么sed? – didierc

+0

很确定你不需要\ n \' – doubleDown

回答

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 
+0

但是我需要在比赛前插入它。不要更换线路。虽然我喜欢文件方法,但我需要在文件之前插入文件。 – Tool

+0

@Tool,对不起,我误解了你正在尝试做的事情。我已经更新了我的答案。你怎么看? – Steve

+0

我试图避免在行尾添加所有反斜杠。你认为这可能吗? – Tool

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

+0

中的'\ n'我如何将它合并到sed(1)上下文中? – Tool

+0

使用此方法获取“sed:-e表达式#1,字符32:未知命令:'''”“。 – Tool

+0

第二个将不起作用,因为如果您在sed中插入多行,则需要用反斜杠终止每行(除最后一行),否则会出错。 – doubleDown

0

如果你坚持要用sed,单程(结尾没有用反斜杠每行的)是将其保存到临时文件,例如

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

然后使用r(读)命令sed

sed '/);/ r tempfile' config/autoload/local.php 
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 
相关问题