在文件中搜索文件中的动态模式并将其替换为变量

在文件中搜索文件中的动态模式并将其替换为变量

我编写了以下命令,将生成三个不同的打乱值

 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

一种是字母数字,一种是数字,一种是字母。

我还有一个 package.sql 文件,它具有以下模式。

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');

关于上述输出的简要说明是,TRANSALTE 行的第一部分应保持原样。 (即)之后的(单引号)中的值p*_value将是静态的,不应更改,而该静态值之后的(单引号)中的值在该 TRANSLATE 行的所有出现中都是动态的。我需要使用每次获得的随机值(即)使用 $A$B$C 或 $A$B 或 $C 的输出来更改该动态部分。

该值需要在 package.sql 文件中替换。

答案1

当且仅当这些值实际上是字母数字并且这些字符串的出现应该全部在文件中替换这应该可以工作(未经测试):

sed -i -e "s/0875642139/${C}/;s/ZYXWVUFEDCBATSRQPONMLKJIHGzyxwvufedcbatsrqponmlkjihg/${A}${B}/;s/ZYXWVUFEDCBATSRQPONMLKJIHGzyxwvufedcbatsrqponmlkjihg0875642139/${A}${B}${C}/" package.sql

答案2

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

我认为您需要使用的关键是正则表达式分组。

您可以非常具体地说明匹配的内容,然后通过引用将其中的大部分内容包含在输出中。

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

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

答案3

您可以按照以下方法(bash shell)

首先创建适当命名的变量、生成变量及其打乱后的对应变量。

然后运行 ​​sed 命令。

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

相关内容