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.