ファイルから動的パターンを検索し、それを変数に置き換えます。

ファイルから動的パターンを検索し、それを変数に置き換えます。

3つの異なるスクランブル値を生成する次のコマンドを作成しました。

 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

1つは英数字、1つは数字、1つは文字です。

次のスキーマを持つ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シェル)

適切に名前付き変数を作成し、変数と混在する対応項目を作成することから始めます。

次に、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

関連情報