-5

我有一个 SQL 查询:

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用随机数/字符串替换每一次出现,并且还希望将相应的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/sed/perl 实现这一点?

我当然尝试过一些东西,但没有在这里与 SO 分享。道歉。这是我尝试过的:

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

这取代了的出现,TO_DATE但我不知道如何在同一行中为两个不同的出现生成单独的随机数,并将它们与相应的子句TO_DATE一起保存到文件中。TO_DATE

4

1 回答 1

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并用这个加密字符串替换找到的字符串。因为in总是应该是 3 的倍数,以避免base64字符从末尾开始。仅当and在随机字符串中可接受时才有效。bsdd=+/

于 2013-06-04T08:46:31.797 回答