여러 삽입 명령이 포함된 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