2017-04-25 35 views
0
replace: 
    path: "{{ drupal.install_dir }}/{{ drupal.project_name }}/sites/default/settings.php" 
    regexp: '(\s+)(\'database\' => \'{{ drupal.database_name }}\',)$' 
    replace: '\1\2\n\1\'charset\' => \'utf8mb4\',\n\1\'collation\' => \'utf8mb4_unicode_ci\',' 

但給人的錯誤:奇怪的錯誤在Ansible關於正則表達式

path: "{{ drupal.install_dir }}/{{ drupal.project_name }}/sites/default/settings.php" 
regexp: '(\s+)(\'database\' => \'{{ drupal.database_name }}\',)$' 
       ^here 

但在https://regex101.com/

+0

錯誤內容在哪裏?爲什麼不簡單地用雙引號括起整個表達式呢?而不是逃避單一的。 – techraf

+0

@techraf我不認爲雙引號是有效的(至少不是對我來說,我已經嘗試過了,所有的例子都是單引號的)。錯誤內容是我向你展示的內容,僅僅是一些垃圾。基本上說,有一個語法錯誤。如果我翻轉正則表達式並替換,錯誤出現在替換中,就在旁邊的一個轉義單引號 – JorgeeFG

回答

1

使用雙引號(你需要重複反斜槓即可):

replace: 
    path: "{{ drupal.install_dir }}/{{ drupal.project_name }}/sites/default/settings.php" 
    regexp: "(\\s+)('database' => '{{ drupal.database_name }}',)$" 
    replace: "\\1\\2\\n\\1'charset' => 'utf8mb4',\\n\\1'collation' => 'utf8mb4_unicode_ci'," 
+0

謝謝,這更清晰。你知道如何讓這個「只適用一次」? – JorgeeFG

+0

你是什麼意思? – techraf

+0

如果我多次運行這個函數,我會多次添加「替換」......它甚至不是替換,它更像是一個附加語句(如果你看一下正則表達式,我捕獲該行並放置另外兩行) – JorgeeFG

0

工作我找到了一個解決辦法:

replace: 
     path: "{{ drupal.install_dir }}/{{ drupal.project_name }}/sites/default/settings.php" 
     regexp: '^(\s+)(\x27database\x27 => \x27{{ drupal.database_name }}\x27,)$' 
     replace: '\1\2\n\1"charset" => "utf8mb4",\n\1"collation" => "utf8mb4_general_ci",' 

幸運的是,我可以換雙引號和單引號(PHP數組)。 \ x27解決方法在替換中不起作用,但它在正則表達式中起作用。 (\ X27 =「)

0

在一個single quote style scalar,你不得不‘逃離’任何單引號這是標有一部分一個額外的單引號:

regexp: '(\s+)(\''database\'' => \''{{ drupal.database_name }}\'',)$' 
    replace: '\1\2\n\1\''charset\'' => \''utf8mb4\'',\n\1\''collation\'' => \''utf8mb4_unicode_ci\'',' 

沒有其他字符需要(或可以)逃跑,那些單引號風格的標量內。