我试图导入一个非常大的数据库,看起来有些引号没有很好地转义。我已经尝试使用基本的正则表达式规则来制作一个bash脚本,但总会有例外情况,即使设法逃脱了大部分内容,我也无法解决所有问题。
因此,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''""然后逃避"内容"内的引号。我试着编辑一个我找到的例子,我得到了这个:
N'((?:.(?!', ))*.)'
修改:I improved it 以便它只匹配N''内部的内容。
例如perl:
perl -ne" s /(?< = N')((?:。(?!',))*。)(')/ \ 1 /克;打印"
但是现在我试图逃避比赛中的引语,任何想法?
谢谢!
答案 0 :(得分:0)
我想我找到了解决方案:
perl -ne "s/(?<!((\(| )N))(?:'{2})*\K(')(?!(, (N'|NULL|CAST|[-0-9])|\)\n))/\3'/g;print"
应该逃避不是分隔符的每个奇数引号。