1

I have written the below commands that will generate three different shuffled vales

 A=`echo 'abcdefghijklmnopqrstuvwxyz' | sed 's/./&\n/g' | shuf | tr -d "\n"`
        B=`echo 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' | sed 's/./&\n/g' | shuf | tr -d "\n"`
        C=`echo '123456789' | sed 's/./&\n/g' | shuf | tr -d "\n"`

$ echo $A$B$C
zvjmaqwxgchylentifdoprkubsUFTCQEMZKVOLBWYJRPSDHIGXNA729314856

$ echo $C
729314856

$ echo $A$B
zvjmaqwxgchylentifdoprkubsUFTCQEMZKVOLBWYJRPSDHIGXNA

One is Alpha numeric, one is numbers and one is alphabets.

I also have a package.sql file which has below patterns.

grep TRANSLATE package.sql
         RETURN TRANSLATE(p1_value,'0123456789', '0875642139');
         RETURN TRANSLATE(p2_value,'0123456789', '0875642139');
         RETURN TRANSLATE(p3_value,'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz','ZYXWVUFEDCBATSRQPONMLKJIHGzyxwvufedcbatsrqponmlkjihg');
         RETURN TRANSLATE(p4_value,'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789','ZYXWVUFEDCBATSRQPONMLKJIHGzyxwvufedcbatsrqponmlkjihg0875642139');

A brief about the above output is, First Part of TRANSALTE lines should remain as it is. (i.e) value in (single quotes)after p*_value will be static and it shouldn't be changed, whereas the value in (Single Quotes) after that static value will be dynamic in all the occurences of that TRANSLATE line. I need to change that dynamic part with the Shuffled values I get every time (i.e) with the output of $A$B$C or $A$B or $C.

That values needs to replaced in that package.sql file.

3 Answers 3

0

If and only if the values are actually alphanumeric and the occurrences of these strings should all be replaced in the file this should work (untested):

sed -i -e "s/0875642139/${C}/;s/ZYXWVUFEDCBATSRQPONMLKJIHGzyxwvufedcbatsrqponmlkjihg/${A}${B}/;s/ZYXWVUFEDCBATSRQPONMLKJIHGzyxwvufedcbatsrqponmlkjihg0875642139/${A}${B}${C}/" package.sql
10
  • May be possible first part is not static.
    – Prvt_Yadav
    Feb 23, 2019 at 5:45
  • Please update your question to include this. It makes a big difference to the implementation if you mean what I think you mean.
    – l0b0
    Feb 23, 2019 at 5:47
  • It's not my question just a comment that it is unclear.
    – Prvt_Yadav
    Feb 23, 2019 at 5:54
  • @10b0 The command which you have given will work if those values are static, But assume, we have changed it now with shuffled values using your SED command. for the next execution the values wont be same right? So It will fail for the second execution, Feb 23, 2019 at 5:59
  • @PRY First Part of Alphanumricals or whatever is static (i.e) value after p*_value will be static and value in (Single Quotes) after that static value will be dynamic. in the below patterns. RETURN TRANSLATE(p1_value,'0123456789', '0875642139'); RETURN TRANSLATE(p2_value,'0123456789', '0875642139'); RETURN TRANSLATE(p3_value,'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz','ZYXWVUFEDCBATSRQPONMLKJIHGzyxwvufedcbatsrqponmlkjihg'); RETURN TRANSLATE(p4_value,'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz012345678 Feb 23, 2019 at 6:04
0
grep TRANSLATE p.sql
| sed -E 's_translate\("(.*)","(.*)"\);_"s/\1/\2/"_' \
# e.g. match the line, and create a sed replacement  "s/012/210/"
| xargs -I% sed -i -e "%" file

I think the key thing you need to use is regex grouping.

You can be very specific about what you match, and then include most of it in the output by reference.

sed 's#(common_str[(][keep class 0-9]+",")[replace class]+#\1replacement str#'

sed 's#
(common_str[(][keep class 0-9]+",")[replace class]+
#
\1replacement str
#'`
0

You may follow the approach (bash shell)

First create appropriately named variables, generated variables, and their shuffled counterparts.

Then run the sed command.

num=`LC_ALL=C printf '%s' {0..9}`
A2Z=`LC_ALL=C printf '%s' {A..Z}`
a2z=`LC_ALL=C printf '%s' {a..z}`

 alpha=${A2Z}${a2z}
alnum=${alpha}${num}

 num_shuf=`echo "$num" | fold -w 1 | shuf | tr -d "\n"`
 alpha_shuf=`echo "$alpha" | fold -w 1 | shuf | tr -d "\n"`
 alnum_shuf=`echo "$alnum" | fold -w 1 | shuf | tr -d "\n"`

 sed -e "
    /TRANSLATE/! b

    # numeric
    /,'$num',/ s/'[^']*'/,'$num_shuf'/2

    # alphabetic
    /,'$alpha',/ s/,'[^']*'/,'$alpha_shuf'/2

    # alphanumeric
    /,'$alnum',/ s/,'[^']*'/,'$alnum_shuf'/2
 " input.sql

You must log in to answer this question.

Not the answer you're looking for? Browse other questions tagged .