SSS
SSS

Reputation: 2442

Substituting a single line with multiple lines of text

In Linux what command can I use to replace a single line of text with new multiple lines? I want to look for a keyword on a line and delete this line and replace it with multiple new lines. So in the text shown below I want to search for the line that contains "keyword" and replace the entire line with 3 new lines of text as shown.

For example replacing the line containing the keyword,

This is Line 1
This is Line 2 that has keyword
This is Line 3

changed to this:

This is Line 1
Inserted is new first line
Inserted is new second line
Inserted is new third line
This is Line 3

Upvotes: 10

Views: 9992

Answers (3)

technosaurus
technosaurus

Reputation: 7802

you can do it using shell builtins too:

STRING1_WITH_MULTIPLE_LINES="your
text
here"

STRING2_WITH_MULTIPLE_LINES="more
text"

OUTPUT=""
while read LINE || [ "$LINE" ]; do
  case "$LINE" in
    "Entire line matches this")OUTPUT="$OUTPUT$STRING1_WITH_MULTIPLE_LINES
";;
    *"line matches this with extra before and/or after"*)OUTPUT="$OUTPUT$STRING2_WITH_MULTIPLE_LINES
";;
    *)OUTPUT="$OUTPUT$LINE
";;
  esac
done < file
echo "$OUTPUT" >file

Upvotes: 1

Jonathan Leffler
Jonathan Leffler

Reputation: 753725

Create a file, script.sed, containing:

/keyword/{i\
Inserted is new first line\
Inserted is new second line\
Inserted is new third line
d
}

Apply it to your data:

sed -f script.sed your_data

There are numerous variations on how to do it, using the c and a commands instead of i and/or d, but this is reasonably clean. It finds the keyword, inserts three lines of data, and then deletes the line containing the keyword. (The c command does that all, but I didn't remember that it existed, and the a command appends the text and is essentially synonymous with i in this context.)

Upvotes: 8

kev
kev

Reputation: 161674

$ sed '/keyword/c\
> Inserted is new first line\
> Inserted is new second line\
> Inserted is new third line' input.txt

This is Line 1
Inserted is new first line
Inserted is new second line
Inserted is new third line
This is Line 3

$ and > are bash prompt

Upvotes: 13

Related Questions