Reputation: 113
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
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
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
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
Reputation: 14949
You can try this awk
,
awk -F, '/HELLO/{ $3=" NEW, "$3;}1' OFS=, infile.txt > outfile.txt
Upvotes: 1
Reputation: 6204
The following produces your desired output:
perl -pe 's/^HELLO.+?,.+?,\K/ NEW, /' infile.txt > outfile.txt
Hopt this helps!
Upvotes: 2
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