2013-06-04 66 views
-5

我有一個SQL查詢:更換用awk/sed的

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的?

我肯定已經嘗試了一些東西,雖然沒有在這裏分享。道歉。這是我曾嘗試:

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

這取代TO_DATE的occurances,但我不明白我怎麼能產生在同一行獨立的隨機數爲TO_DATE兩種不同occurances,並將其保存到文件與一起對應於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創建一個半隨機字符串,並用此加密字符串替換查找到的字符串。由於base64中的bsdd總是應該是3的倍數以避免=字符的結尾。它只適用於+/在隨機字符串中可接受。