用awk / sed替换

时间:2013-06-04 07:06:50

标签: sed awk

我有一个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子句一起保存到文件中。

1 个答案:

答案 0 :(得分: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创建一个半随机字符串,并使用此加密字符串替换找到的字符串。由于base64 bs中的dd总是应该是3的倍数,以避免结尾的=字符。它仅适用于随机字符串中+/可接受的情况。