파일에서 동적 패턴을 검색하고 이를 변수로 바꿉니다.

파일에서 동적 패턴을 검색하고 이를 변수로 바꿉니다.

세 가지 다른 스크램블 값을 생성하는 다음 명령을 작성했습니다.

 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 쉘)

적절하게 이름이 지정된 변수를 만들고, 변수와 섞인 대응 항목을 생성하는 것부터 시작하세요.

그런 다음 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

관련 정보