我有一个包含数百个SQL插入语句的文件,比如
INSERT INTO dbname.dbo.tbl1(col1, col2, col3,...., coln,...) VALUES (val1, val2, val3,....,valn,....)
我需要在所有insert语句中将“valn”替换为“null”。
注意:“valn”出现在第(n-1)个逗号后面。
我如何在perl中实现这一目标?
答案 0 :(得分:1)
perl -i.bak -pe's/,[^,]+,([^)]+)\)/,NULL,$1)/g' your.sql
答案 1 :(得分:1)
如果您的数据可能包含带引号的逗号,那么简单的正则表达式就不够了。您可以尝试提出另一种解决方案,但最好的方法是对字符串的那一部分使用Text::CSV_XS等CSV模块。
Text::CSV_XS模块有很多选项和功能,它可能有点侵入性,但它可能会被调整以处理您的数据。尝试这些方面的东西。一定要保留备份。
用法: script.pl input.txt > output.txt
<强>代码:强>
use strict;
use warnings;
use Text::CSV_XS;
while (<>) {
my $csv = Text::CSV_XS->new ({
binary => 1,
keep_meta_info => 1,
allow_whitespace => 1,
});
my ($pre, $str, $post) = /^(.* VALUES *\()([^)]+)(\).*)$/;
$csv->parse($str);
my @cols = $csv->fields();
my $n = 4; # The N-th field
splice @cols, $n, 1, "null";
$csv->combine(@cols);
print $pre, $csv->string(), $post;
}