2014-09-10 67 views
0

我試圖導入一個非常大的數據庫,它似乎有一些引號不能很好地轉義。我已經嘗試過使用基本的正則表達式規則來創建一個bash腳本,但總是有例外,即使設法逃脫其中的大部分,我也無法修復它們。使用正則表達式在SQL Server轉儲中轉義引號

所以在SQL Server中的基本語法INSERT是這種形式的:

INSERT INTO Production.UnitMeasure 
VALUES (N'FT2', N'Square Feet ', '20080923'), 
     (N'Y', N'Yards', '20080923'), 
     (N'Y3', N'Cubic Yards', '20080923'); 

所以在這裏它是正確的,是沒有問題的。但對於這一個:

INSERT INTO Production.UnitMeasure 
VALUES (N'FT2', N'Square' Feet ', '20080923'), 
     (N'Y', N'Yards'', '20080923'), 
     (N'Y3', N'CubiN' Yards', '20080923'); 

這是另一回事。我想逃避N'內的所有引用。所以我想得到:

INSERT INTO Production.UnitMeasure 
VALUES (N'FT2', N'Square'' Feet ', '20080923'), 
     (N'Y', N'Yards''', '20080923'), 
     (N'Y3', N'CubiN'' Yards', '20080923'); 

(一個報價逃脫報價)。

所以我的想法是識別「N'something」形式的每個字段,然後在「something」內部引用引號。我嘗試過編輯,我發現了一個例子,我得到這個:

N'((?:.(?!',))*.)' 

編輯:I improved it,使其只匹配裏面有什麼N「」

所以對於爲例Perl中:

perl的-ne 「S/'((:(??。,))*)(')/ \ 1 /克;打印(< = N?)'」

但現在我試圖逃避比賽中的報價, 有任何想法嗎 ?

謝謝!

+0

數據是如何變得腐敗開始的? :<無論如何,展示*它是如何在bash中使用的 - 它可以簡單地作爲引用或工具(例如。sed)的特性。 – user2864740 2014-09-10 20:17:05

+0

你可以把一個語句的期望輸出? – 2014-09-10 20:21:30

+0

如果您使用原始bash正則表達式字符串,我不確定它是否支持lookarounds。 – RevanProdigalKnight 2014-09-10 20:25:56

回答

0

我想我找到了解決辦法:

perl -ne "s/(?<!((\(|)N))(?:'{2})*\K(')(?!(, (N'|NULL|CAST|[-0-9])|\)\n))/\3'/g;print" 

應該逃避每個奇數不在一個分隔符引號。