# edit string in a multi-line file

**URL:** <https://forum.ansible.com/t/edit-string-in-a-multi-line-file/38266>\
**Category:** Ansible Project\
**Created:** [July 27, 2023, 1:13pm UTC](https://forum.ansible.com/t/edit-string-in-a-multi-line-file/38266 "2023-07-27T13:13:42Z")\
**Posts on this page:** 6\
**Page:** 1

<div class="post-metadata">

**Author:** ![Kathy\_L](https://sea1.discourse-cdn.com/ansible/user_avatar/forum.ansible.com/kathy_l/32/2652_2.png) [@Kathy\_L](https://forum.ansible.com/u/Kathy_L)\
**Post date:** [July 27, 2023, 1:13pm UTC](https://forum.ansible.com/t/edit-string-in-a-multi-line-file/38266/1 "2023-07-27T13:13:42Z")

</div>

I am trying to edit a string in a multi-line file. For instance, if I had this string:

This is a file and I am editing it

I want to add the string “new” in front of file _if_ it does not exist already.

I’ve tried lineinfile, but the issue is that I don’t know what else is on the line. There could be more data after “This is a file and I am editing it” that I don’t want to change. What is the best way to do this?

---

<div class="post-metadata">

**Author:** ![dulhaver](https://sea1.discourse-cdn.com/ansible/user_avatar/forum.ansible.com/dulhaver/32/1061_2.png) [@dulhaver](https://forum.ansible.com/u/dulhaver)\
**Post date:** [July 27, 2023, 2:08pm UTC](https://forum.ansible.com/t/edit-string-in-a-multi-line-file/38266/2 "2023-07-27T14:08:42Z")

</div>

would this do what you want?

- name: edit a line in a file  
ansible.builtin.command:  
chdir: /home/username/  
cmd: ‘sed -i “s/This is a file/This is a new file/” somefile’

---

<div class="post-metadata">

**Author:** ![dulhaver](https://sea1.discourse-cdn.com/ansible/user_avatar/forum.ansible.com/dulhaver/32/1061_2.png) [@dulhaver](https://forum.ansible.com/u/dulhaver)\
**Post date:** [July 27, 2023, 2:12pm UTC](https://forum.ansible.com/t/edit-string-in-a-multi-line-file/38266/3 "2023-07-27T14:12:21Z")

</div>

curious actually how this can be achieved with sophisticated regex and the lineinfile module

---

<div class="post-metadata">

**Author:** ![Kathy\_L](https://sea1.discourse-cdn.com/ansible/user_avatar/forum.ansible.com/kathy_l/32/2652_2.png) [@Kathy\_L](https://forum.ansible.com/u/Kathy_L)\
**Post date:** [July 27, 2023, 2:57pm UTC](https://forum.ansible.com/t/edit-string-in-a-multi-line-file/38266/4 "2023-07-27T14:57:25Z")

</div>

That will work - yes. I was so focused on using lineinfile or another ansible module, I forgot about sed. Thank you!

---

<div class="post-metadata">

**Author:** ![shearn](https://avatars.discourse-cdn.com/v4/letter/s/ba8739/32.png) [@shearn](https://forum.ansible.com/u/shearn)\
**Post date:** [July 27, 2023, 3:01pm UTC](https://forum.ansible.com/t/edit-string-in-a-multi-line-file/38266/5 "2023-07-27T15:01:01Z")

</div>

What you want to use is backrefs.

[https://docs.ansible.com/ansible/latest/collections/ansible/builtin/lineinfile\_module.html](https://docs.ansible.com/ansible/latest/collections/ansible/builtin/lineinfile_module.html)

An Example from the document:

_# NOTE: Yaml requires escaping backslashes in double quotes but not in single quotes_

**-**  **name** \*\*:\*\* Ensure the JBoss memory settings are exactly as needed

**ansible.builtin.lineinfile** \*\*:\*\*

**path** \*\*:\*\* /opt/jboss-as/bin/standalone.conf

**regexp** \*\*:\*\* ‘^(._)Xms(\d+)m(._)$’

**line** \*\*:\*\* ‘\1Xms${xms}m\3’

**backrefs** \*\*:\*\* yes

---

<div class="post-metadata">

**Author:** ![utoddl](https://sea1.discourse-cdn.com/ansible/user_avatar/forum.ansible.com/utoddl/32/249_2.png) [@utoddl](https://forum.ansible.com/u/utoddl)\
**Post date:** [July 27, 2023, 7:42pm UTC](https://forum.ansible.com/t/edit-string-in-a-multi-line-file/38266/6 "2023-07-27T19:42:33Z")

</div>

Here’s one solution. It uses backrefs and a negative lookahead assertion.

```auto
- name: Test lineinfile
  hosts: localhost
  gather_facts: false
  tasks:
    - name: Create a file to work on
      ansible.builtin.copy:
        content: |
           First line of a file
           Second line of the same file
           This is a file and I am editing it. Extra Stuff!
           Fourth line of this file
        dest: /tmp/textfile.txt

    - name: Show the file content
      ansible.builtin.debug:
        msg: "{{ lookup('file', '/tmp/textfile.txt') }}"

    - name: Insert "new" before "file" in the 3rd line
      ansible.builtin.lineinfile:
        path: /tmp/textfile.txt
        regexp: '(This is a )(?!>new)(file and I am editing it\..*)'
        backrefs: true
        line: 'new '

    - name: Show the file content a 2nd time
      ansible.builtin.debug:
        msg: "{{ lookup('file', '/tmp/textfile.txt') }}"

    - name: Second identical lineinfile should not make changes
      ansible.builtin.lineinfile:
        path: /tmp/textfile.txt
        regexp: '(This is a )(?!>new)(file and I am editing it\..*)'
        backrefs: true
        line: 'new '

    - name: Show the file content a 3nd time
      ansible.builtin.debug:
        msg: "{{ lookup('file', '/tmp/textfile.txt') }}"

```
