将第n个逗号后的文本替换为null

时间:2011-10-31 20:41:15

标签: perl

我有一个包含数百个SQL插入语句的文件,比如

INSERT INTO dbname.dbo.tbl1(col1, col2, col3,...., coln,...) VALUES (val1, val2, val3,....,valn,....)

我需要在所有insert语句中将“valn”替换为“null”。

注意:“valn”出现在第(n-1)个逗号后面。

我如何在perl中实现这一目标?

2 个答案:

答案 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;
}