2013-06-04 5 views
-5

У меня есть SQL-запрос:Замена с использованием AWK/СЭД

update SCOTT.GLOBAL set DAY_LIGHT_SAVING_STARTS=TO_DATE('03/31/2013 02:00:00', 'MM/DD/YYYY HH24:MI:SS'), DAY_LIGHT_SAVING_ENDS=TO_DATE('10/27/2011 02:00:00', 'MM/DD/YYYY HH24:MI:SS') where zone='GMT'; 

Я хочу, чтобы заменить все вхождение в TO_DATE со случайным числом/строки, а также хотят correcponding TO_DATE и случайное число/строку, которая будет сохранена в файл. Например:

update SCOTT.GLOBAL set DAY_LIGHT_SAVING_STARTS=abc, DAY_LIGHT_SAVING_ENDS=pqr where zone='GMT'; 

Файл:

TO_DATE('03/31/2013 02:00:00', 'MM/DD/YYYY HH24:MI:SS')~~~~abc 
TO_DATE('10/27/2011 02:00:00', 'MM/DD/YYYY HH24:MI:SS')~~~~pqr 

Как я могу добиться этого с AWK/СЭД/Perl?

Я, конечно, что-то пробовал, хотя и не делился с SO здесь. Извиняюсь. Вот то, что я пробовал:

perl -p -i -e "s/TO_DATE(.*?)\)/abc/g" my.out 

Это заменяет места где TO_DATE, но я не могу понять, как я могу генерировать отдельные случайные числа в одной строке для двух различных появлений из TO_DATE, и сохранить их в файл вместе с соответствующее предложение TO_DATE.

+0

SO не является кодовым письмом. Мы поможем вам найти проблемы с вашим кодом, но «мне нужно, чтобы разработчик написал решение для меня на одном из трех языков» выходит за рамки этого. – ikegami

ответ

0

Если я хорошо понял ваши потребности, вы можете попробовать в что-то вроде ниже:

while read x; do 
    while [[ $x =~ TO_DATE\([^\)]+\) ]]; do 
    rand=$(dd if=/dev/urandom bs=3 count=1 2>/dev/null|base64) 
    x=${x/$BASH_REMATCH/$rand} 
    done 
    echo $x 
done<<XXX 
update SCOTT.GLOBAL set DAY_LIGHT_SAVING_STARTS=TO_DATE('03/31/2013 02:00:00', 'MM/DD/YYYY HH24:MI:SS'), DAY_LIGHT_SAVING_ENDS=TO_DATE('10/27/2011 02:00:00', 'MM/DD/YYYY HH24:MI:SS') where zone='GMT'; 
XXX 

Выход

update SCOTT.GLOBAL set DAY_LIGHT_SAVING_STARTS=YsuW, DAY_LIGHT_SAVING_ENDS=5Vve where zone='GMT'; 

Это считывается каждые строки из файла (который заменяется здесь, является здесь-документ). Если строка совпадает с шаблоном TO_DATE\([^\)]+\), она создает полуслучайную строку из сопоставимой доли чтения /dev/urandom и заменяет найденную строку этой зашифрованной строкой. Из-за base64bs в dd всегда должен быть кратным 3, чтобы избежать символа = с конца. Он работает только в том случае, если в случайной строке допустимы + и /.

Смежные вопросы