user3342338
user3342338

Reputation: 113

Insert a field after matching pattern

I'd like to search for a specific pattern in a file and then insert a field into the line with the matching pattern. For example, I'd like to search for the pattern HELLO and then insert a word NEW after 2nd ,.

infile.txt

HELLO (A0[], B0[],C0,D0, E0)
HELLO (A1[], B1[],C1,D1, E1)
...
HELLO (Aj[], Bj[],Cj,Dj, Ej)

outfile.txt should be:

HELLO (A0[], B0[], NEW, C0,D0, E0)
HELLO (A1[], B1[], NEW, C1,D1, E1)
...
HELLO (Aj[], Bj[], NEW, Cj,Dj, Ej)

thanks

Upvotes: 1

Views: 161

Answers (7)

jaypal singh
jaypal singh

Reputation: 77095

Try something like:

sed '/^HELLO/s/B[0-9a-zA-Z]\+\[\],/& NEW, /' file

$ cat file
HELLO (A0[], B0[],C0,D0, E0)
HELLO (A1[], B1[],C1,D1, E1)
HELLO (Aj[], Bj[],Cj,Dj, Ej)

sed '/^HELLO/s/B[0-9a-zA-Z]\+\[\],/& NEW, /' file
HELLO (A0[], B0[], NEW, C0,D0, E0)
HELLO (A1[], B1[], NEW, C1,D1, E1)
HELLO (Aj[], Bj[], NEW, Cj,Dj, Ej)

Upvotes: 0

Jotne
Jotne

Reputation: 41456

This sed should take care of all:

cat file
HELLO (A0[], B0[],C0,D0, E0, G0[])
HELLO (A1[], B1[],C1,D1, E1, G1[])
...
HELLO (A122[], B122[],C122,D122, E122, G122[])
HELLO (A32C[], B32C[],C32C,D32C, E32C, G32C[])
HELLO (Aj[], Bj[],Cj,Dj, Ej, Gj[])

sed '/^HELLO/s/B[^[]*\[\],/& NEW, /' file
HELLO (A0[], B0[], NEW, C0,D0, E0, G0[])
HELLO (A1[], B1[], NEW, C1,D1, E1, G1[])
...
HELLO (A122[], B122[], NEW, C122,D122, E122, G122[])
HELLO (A32C[], B32C[], NEW, C32C,D32C, E32C, G32C[])
HELLO (Aj[], Bj[], NEW, Cj,Dj, Ej, Gj[])

It will work with any number or letter after B, like B122 B12AB etc
The non greedy [^[]* is better to us than .*, since it will fail if there are other brackets like G1[]

Upvotes: 1

mpapec
mpapec

Reputation: 50637

perl -pe 's|HELLO(.+?,){2}\K| NEW, |' file

output

HELLO (A0[], B0[], NEW, C0,D0, E0)
HELLO (A1[], B1[], NEW, C1,D1, E1)
HELLO (Aj[], Bj[], NEW, Cj,Dj, Ej)

Upvotes: 2

potong
potong

Reputation: 58381

This might work for you (GNU sed):

sed '/HELLO/s/,/, NEW,/2' file

Upvotes: 2

sat
sat

Reputation: 14949

You can try this awk,

awk -F, '/HELLO/{ $3=" NEW, "$3;}1' OFS=, infile.txt > outfile.txt

Upvotes: 1

Kenosis
Kenosis

Reputation: 6204

The following produces your desired output:

perl -pe 's/^HELLO.+?,.+?,\K/ NEW, /' infile.txt > outfile.txt

Hopt this helps!

Upvotes: 2

Amit
Amit

Reputation: 20456

Updating as per your updated question.

$ cat infile.txt
HELLO (A0[], B0[],C0,D0, E0)
HELLO (A1[], B1[],C1,D1, E1)
HELLO (A2[], B1[],C2,D2, E2)
HELLO (A3[], B3[],C3,D3, E3)
HELLO (A4[], B4[],C4,D4, E4)
HELLO (A5[], B5[],C5,D5, E5)

$ sed -i '' '/^HELLO/s/\(B[0-9]\[]\),/\1, NEW, /' infile.txt

$ cat infile.txt
HELLO (A0[], B0[], NEW, C0,D0, E0)
HELLO (A1[], B1[], NEW, C1,D1, E1)
HELLO (A2[], B1[], NEW, C2,D2, E2)
HELLO (A3[], B3[], NEW, C3,D3, E3)
HELLO (A4[], B4[], NEW, C4,D4, E4)
HELLO (A5[], B5[], NEW, C5,D5, E5)

Upvotes: 1

Related Questions