Need help with regex groups

I have a requirement - replace specified positions in a string with a character. I found perl regex useful for this approach. however, I am facing the following issue.

The target file 'temp' contains -
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

The goal is to convert position 3 and 4 with '55'. Following is the script-

#!/bin/ksh

position=2
value='55'

nxtpos=4
len_val=2
#head -2 test| tail -1 > temp
x=`perl -pi -e "s/(.{$position})(.*)/\1$value\2/" temp`
echo $x

however on running it, it interprets the \1$value as \155, and replaces nothing.

Could you please suggest what can be done?

position=2
value=55
sed "s/../"$value"/"$position"" temp

Thanks for the response. it surely does do the job at hand. however this is a simplified scenario. Actually i need to replace positions 255 and above, which is not identified using sed. and this syntax doesn't work with perl. Is there something which can be done using perl?

position=123
value=456
perl -pi -e "s/(.{"${position}"}).{"${#value}"}(.*)/\1\Q"${value}"\2/g" temp
1 Like

Setting awk's field separator to "" makes it split a string into individual characters, letting you alter each index individually. awk also has an elegant way to set variables without having to jam them into the expression itself.

$ echo aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa |
awk -v POS=300 -v FS="" -v OFS="" '{ $POS="5"; POS++; $POS="5" } 1'

aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa55aaaaaaa\
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\
aaaa
$

Text arbitrarily split with \ just so people don't unexpectedly find their browsers over a mile wide.

Some versions of awk may be limited to 2048 characters per line. But some versions of sed are too.

Thanks. This does the trick!!

---------- Post updated at 07:09 AM ---------- Previous update was at 01:32 AM ----------

I had to make a small change - terminate the \Q with a \E before the \2 started.