2012-10-31 116 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 
相關問題