diff --git a/library/files/lineinfile b/library/files/lineinfile index f781911ccd1..f5181cbe8ff 100644 --- a/library/files/lineinfile +++ b/library/files/lineinfile @@ -18,6 +18,7 @@ # You should have received a copy of the GNU General Public License # along with Ansible. If not, see . +import pipes import re import os import tempfile @@ -351,9 +352,14 @@ def main(): if ins_bef is None and ins_aft is None: ins_aft = 'EOF' - # Replace the newline character with an actual newline. Don't replace - # escaped \\n, hence sub and not str.replace. - line = re.sub(r'\n', os.linesep, params['line']) + # Replace escape sequences like '\n' while being sure + # not to replace octal escape sequences (\ooo) since they + # match the backref syntax + if backrefs: + line = re.sub(r'(\\[0-9]{1,3})', r'\\\1', params['line']) + else: + line = params['line'] + line = module.safe_eval(pipes.quote(line)) present(module, dest, params['regexp'], line, ins_aft, ins_bef, create, backup, backrefs) diff --git a/test/integration/roles/test_lineinfile/tasks/main.yml b/test/integration/roles/test_lineinfile/tasks/main.yml index f59979473b9..efc55c87f05 100644 --- a/test/integration/roles/test_lineinfile/tasks/main.yml +++ b/test/integration/roles/test_lineinfile/tasks/main.yml @@ -114,7 +114,7 @@ - "result.stat.md5 == 'd5955ee042139dfef16dbe3a7334475f'" - name: replace a line with backrefs - lineinfile: dest={{output_dir}}/test.txt state=present line="This is line 3" backrefs=yes regexp="^(REF) .* \1$" + lineinfile: dest={{output_dir}}/test.txt state=present line="This is line 3" backrefs=yes regexp="^(REF) .* \\1$" register: result - name: assert that the line with backrefs was changed @@ -209,3 +209,40 @@ that: - "result.stat.md5 == 'fef1d487711facfd7aa2c87d788c19d9'" +- name: insert a multiple lines at the end of the file + lineinfile: dest={{output_dir}}/test.txt state=present line="This is a line\nwith \\\n character" insertafter="EOF" + register: result + +- name: assert that the multiple lines was inserted + assert: + that: + - "result.changed == true" + - "result.msg == 'line added'" + +- stat: path={{output_dir}}/test.txt + register: result + +- name: assert test md5 matches after insert the multiple lines + assert: + that: + - "result.stat.md5 == 'c2510d5bc8fdef8e752b8f8e74c784c2'" + +- name: replace a line with backrefs included in the line + lineinfile: dest={{output_dir}}/test.txt state=present line="New \\1 created with the backref" backrefs=yes regexp="^This is (line 4)$" + register: result + +- name: assert that the line with backrefs was changed + assert: + that: + - "result.changed == true" + - "result.msg == 'line replaced'" + +- name: stat the test after the backref line was replaced + stat: path={{output_dir}}/test.txt + register: result + +- name: assert test md5 matches after backref line was replaced + assert: + that: + - "result.stat.md5 == '65f955c2a9722fd43d07103d7756ff9b'" +