wellyno1
wellyno1

Reputation: 13

sed - insert lines when text found / not found

I have issue with sed, i need to accomplish two things with a csv file

  1. in front of each line that does not start UNES I need to add tag "BF2;"
  2. at the start of the file (after UNES if present) I need to add a tag "UNH;"

Example (no UNES;)

50000024;IE15;041111;113901;verstuurd;Aangift;
50000024;IE15;041111;113901;verstuurd;Aangifte;
50000024;IE15;041111;113901;verstuurd;Aangifte;

Example (with UNES;)

UNES;
50000024;IE15;041111;113901;verstuurd;Aangift;
50000024;IE15;041111;113901;verstuurd;Aangifte;
50000024;IE15;041111;113901;verstuurd;Aangifte;

so far I have this:

sed -e 's/^\([^"UNES"]\)/BF2;\1/' | sed '/UNES/ a\UNH;'

THis works as long as a UNES; tag is present - I can't seem to figure out how to insert the UNH; when UNES is not present!

Any help much appreciated

Sample output:

UNES;
UNH;
BF2;50000024;IE15;041111;113901;verstuurd;Aangifte;
BF2;50000024;IE15;041111;113901;verstuurd;Aangifte;
BF2;50000024;IE15;041111;113901;verstuurd;Aangifte;

Upvotes: 1

Views: 173

Answers (3)

vaishali
vaishali

Reputation: 335

Try this, its works for me

sed '/^UNES;$/{i\
UNH;
n};s/^[0-9]*/BF2;&/;' 

Upvotes: 0

Casimir et Hippolyte
Casimir et Hippolyte

Reputation: 89639

You can use this sed command:

sed '/^UNES;$/{i\
UNH;
n};s/^/BF2;/;' file.txt

details:

/^UNES;$/i\ UNH; insert a new line when UNES; is the whole line.

n replaces the pattern space with the next line

Upvotes: 1

Tom Fenech
Tom Fenech

Reputation: 74695

Here's how you could do it using awk:

awk 'NR==1 {if(f=/^UNES;/)print; print "UNH;"} !f{print "BF2;" $0} {f=0}' file

On the first line, if /^UNES;/ is matched, print it and set the flag f. Always print "UNH;". If the f flag has been set, don't do the next action, which works for the rest of the lines. Always reset f to 0 after the first line so all further lines have "BF2;" added to the start.

Testing it out:

$ cat file
UNES;
50000024;IE15;041111;113901;verstuurd;Aangift;
50000024;IE15;041111;113901;verstuurd;Aangifte;
50000024;IE15;041111;113901;verstuurd;Aangifte;
$ awk 'NR==1 {if(f=/^UNES;/)print; print "UNH;"} !f{print "BF2;" $0} {f=0}' file
UNES;
UNH;
BF2;50000024;IE15;041111;113901;verstuurd;Aangift;
BF2;50000024;IE15;041111;113901;verstuurd;Aangifte;
BF2;50000024;IE15;041111;113901;verstuurd;Aangifte;
$ cat file2
50000024;IE15;041111;113901;verstuurd;Aangift;
50000024;IE15;041111;113901;verstuurd;Aangifte;
50000024;IE15;041111;113901;verstuurd;Aangifte;
$ awk 'NR==1 {if(f=/^UNES;/)print; print "UNH;"} !f{print "BF2;" $0} {f=0}' file2
UNH;
BF2;50000024;IE15;041111;113901;verstuurd;Aangift;
BF2;50000024;IE15;041111;113901;verstuurd;Aangifte;
BF2;50000024;IE15;041111;113901;verstuurd;Aangifte;

Upvotes: 2

Related Questions