bashshellseded

Shell script: Insert multiple lines into a file ONLY after a specified pattern appears for the FIRST time. (The pattern appears multiple times)


I want to insert multiple lines into a file using shell script. Let us consider my original file: original.txt:

aaa
bbb
ccc
aaa
bbb
ccc
aaa
bbb
ccc
.
.
.

and my insert file: toinsert.txt

111
222
333

Now I have to insert the three lines from the 'toinsert.txt' file ONLY after the line 'ccc' appears for the FIRST time in the 'original.txt' file. Note: the 'ccc' pattern appears more than one time in my 'original.txt' file. After inserting ONLY after the pattern appears for the FIRST time, my file should change like this:

aaa
bbb
ccc
111
222
333
aaa
bbb
ccc
aaa
bbb
ccc
.
.
.

I should do the above insertion using a shell script. Can someone help me?

Note2: I found a similar case, with a partial solution:

sed -i -e '/ccc/r toinsert.txt' original.txt

which actually does the insertion multiple times (for every time the ccc pattern shows up).


Solution

  • Use ed, not sed, to edit files:

    printf "%s\n" "/ccc/r toinsert.txt" w | ed -s original.txt
    

    It inserts the contents of the other file after the first line containing ccc, but unlike your sed version, only after the first.