Search and Replace a text if the line contains a pattern

My text file looks like below

.
.
.
abcdefghi
jklmnop

$Bad_ptrq_GTS=rcrd_ip.txt
$Bad_abcd_REJ=rcrd_op.txt

ghijklm
$Bad_abcd_TYHS=rcrd_op.txt
abcgd

abcdefghi
jklmnop

$Bad_ptrq_GTS=rcrd_ip.txt
$Bad_abcd_JER=rcrd_op.txt

qrstuv
$Bad_abcd_TYHS=rcrd_op.txt
wxyz
.
.
.

I have replace .txt with .log only if the line contains $BadGTS or $BadJER

Output:

.
.
.
abcdefghi
jklmnop

$Bad_ptrq_GTS=rcrd_ip.log
$Bad_abcd_REJ=rcrd_op.log

ghijklm
qrstuv
$Bad_abcd_TYHS=rcrd_op.txt
abcgd

abcdefghi
jklmnop

$Bad_ptrq_GTS=rcrd_ip.log
$Bad_abcd_JER=rcrd_op.log

qrstuv
qrstuv
$Bad_abcd_TYHS=rcrd_op.txt
wxyz
.
.
.

:rolleyes:

awk '/\$Bad/&&(/GTS/||/JER/||/REJ/)&&/txt/ {gsub(/.txt/, ".log")} 1' infile
1 Like

Is this a typo?
Shorten the solution krishmaths posted.
(no need to test for txt, since txt is what we replace)

awk '/\$Bad.*(GTS|JER)/ {gsub(/.txt/, ".log")} 1' file
abcdefghi
jklmnop

$Bad_ptrq_GTS=rcrd_ip.log
$Bad_abcd_JER=rcrd_op.log

ghijklm
$Bad_abcd_TYHS=rcrd_op.txt
abcgd

abcdefghi
jklmnop

$Bad_ptrq_GTS=rcrd_ip.log
$Bad_abcd_JER=rcrd_op.log

qrstuv
$Bad_abcd_TYHS=rcrd_op.txt
wxyz
1 Like