덤프 파일의 SQL 삽입 명령에서 두 개의 열 삭제

덤프 파일의 SQL 삽입 명령에서 두 개의 열 삭제

여러 삽입 명령이 포함된 SQL 덤프 파일이 있습니다. 삭제하고 싶습니다.sed또는grep(또는 또 다른 간단한세게 때리다기술), 조항의 특정 열 및 이에 상응하는 데이터 VALUES. 그러므로:

INSERT INTO "capt" ("fid_c1","id","fid_capt","mslink","capt", ...) VALUES ('0','0','24','189','CAP.FU1', ...);

sed 또는 grep은 "mslink"열과 해당 값을 제거해야 합니다. 둘 다 위치 4"189" 에 있습니다 . 가치가 없다원하지 않는 열의 원래 위치를 알 수 없습니다.따라서 정규 표현식은 일종의 메모리를 사용하여 제거해야 합니다.n번째쿼리 값은N위치 "mslink".

하나불완전한 sed명령은 다음과 같습니다:

sed -re 's/INSERT INTO "capt" \((.*,?)*"mslink",?(.*,?)*\) VALUES \((.*,?)+\);/INSERT INTO "capta" (\1\2) VALUES (\3)/' file.sql

답변1

나는 이 작업을 수행할 수 있는 Perl 코드 한 줄을 생각할 수 없지만 여기에 여러분이 원하는 것을 수행할 Perl 스크립트가 있습니다.

$match를 검색하려는 항목으로 변경하세요. 이 스크립트는 파일 전체를 반복하고 결과 파일을 표준 출력으로 인쇄합니다. 결과를 파일로 파이프하면 변경 사항이 적용됩니다. 코드에 대해 더 많은 의견을 제시하고 싶었습니다. 미안합니다.

스크립트는 괄호 안에 데이터가 있고 쉼표로 구분된 "VALUES" 키워드를 사용합니다. 그렇지 않으면 실패할 수 있습니다.

코드가 "sql_parser.pl"로 저장되어 있으면 %> perl sql_parser.pl [file] 명령을 실행하십시오.

#!/usr/bin/perl
#
use strict;

sub usage
{
    print "usage: sql_parser.pl [file]\n";
}

# load the input file
sub load
{
    my $file = shift;
    open my $in, "<", $file or die "unable to open $file as input $!";
    my @data = <$in>;
    close $in;
    foreach (@data) { chomp; s/\cM//g; }
    return @data;
}

# what to search for
# could supply this parameter on the command line too
# my $match = shift; 
my $match = 'mslink';

# get the file to process on the command line
my $file = shift;
{
    # load the data
    my @lines = &load($file);

    #print "$_\n" foreach (@lines);

    # loop through the data in the file
    foreach (@lines)
    {
        # match the line of text
        my @f = m/(.*?\() (.*?) (\)\s+?VALUES\s+?\() (.*?) (\).*?$)/x;
        if (@f)
        {
            my @cmds = split /,/, $f[1];
            my @nums = split /,/, $f[3];
            my $matched = 0;
            for ( my $i = 0; $i < @cmds; ++$i )
            {
                if ( $cmds[$i] =~ /$match/ )
                {
                    #print "$cmds[$i]\n";
                    undef $cmds[$i];
                    undef $nums[$i];
                    $matched = 1;
                    last;
                }
            }
            ( $f[1] = join ',', @cmds ) =~ s/\,\,/,/;
            ( $f[3] = join ',', @nums ) =~ s/\,\,/,/;
            if ($matched)
            {
                $_ = join ' ', @f;
            }
        }
    }
    print "$_\n" foreach (@lines);
}

이 데이터에 대해 다음 스크립트를 실행했습니다.

INSERT INTO "capt" ("fid_c1","id","fid_capt","mslink","capt", ...) VALUES ('0','0','24','189','CAP.FU1', ...);

$ perl sql_parser.pl test.dat 출력은 다음과 같습니다.

INSERT INTO "capt" ( "fid_c1","id","fid_capt","capt", ... ) VALUES ('0','0','24','CAP.FU1', ... );

캡처 출력: $ perl sql_parser.pl test.dat > Capture.txt

관련 정보