Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Add multiple lines in file using bash script

Tags:

bash

macos

sed

Using a bash script, I am trying to insert a line in a file (eventually there will be 4 extra lines, one after the other).

I am trying to implement the answer by iiSeymour to the thread:

Insert lines in a file starting from a specific line

which I think is the same comment that dgibbs made in his own thread:

Bash: Inserting a line in a file at a specific location

The line after which I want to insert the new text is very long, so I save it in a variable first:

field1=$(head -2 file847script0.xml | tail -1)

The text I want to insert is:

insert='newtext123'

When running:

sed -i".bak" "s/$field1/$field1\n$insert/" file847script0.xml 

I get the error:

sed: 1: "s/<ImageAnnotation xmln ...": bad flag in substitute command: 'c'

I also tried following the thread

sed throws 'bad flag in substitute command'

but the command

sed -i".bak" "s/\/$field1/$field1\n$insert/" file847script0.xml

still gives me the same error:

sed: 1: "s/\/<ImageAnnotation xm ...": bad flag in substitute command: 'c'

I am using a Mac OS X 10.5.

Any idea of what am I doing wrong? Thank you!

like image 897
user3570398 Avatar asked Feb 19 '26 23:02

user3570398


1 Answers

Good grief, just use awk. No need to worry about special characters in your replacement text or random single-character commands and punctuation.

In this case it looks like all you need is to print some new text after the 2nd line so that's just:

$ cat file
a
b
c

$ insert='absolutely any text you want, including newlines
slashes (/), backslashes (\\), whatever...'

$ awk -v insert="$insert" '{print} NR==2{print insert}' file
a
b
absolutely any text you want, including newlines
slashes (/), backslashes (\), whatever...
c
like image 143
Ed Morton Avatar answered Feb 22 '26 11:02

Ed Morton