我有一个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子句一起保存到文件中。
答案 0 :(得分:0)
如果我理解你的需求,你可以尝试bash类似下面的事情:
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
创建一个半随机字符串,并使用此加密字符串替换找到的字符串。由于base64
bs
中的dd
总是应该是3的倍数,以避免结尾的=
字符。它仅适用于随机字符串中+
和/
可接受的情况。